Я получил веб-приложение, реализованное с помощью Spring, используя STOMP через WebSockets Messaging, аналогично описанному здесь (с RabbitMQ на бэкэнд). Он работает на Tomcat, и я могу подключиться к приложению, используя обычные URL-адреса (например, http://host/server/
). Мне также был предоставлен демо-клиент - страница JSPX, в которой используются Web-узлы Modernizr и SockJS. Код подключения в демо-клиенте выглядит следующим образом:
if (Modernizr.websockets) {
socket = new WebSocket('ws://host/server/endpointx');
}
else {
socket = new SockJS('/server/endpointy');
}
stompClient = Stomp.over(socket);
stompClient.connect(headers, function(frame) { ... });
....
Демо-клиент отлично работает (когда я загружаю JSPX-страницу в браузере, я могу подключиться к серверу). Но моя цель - подключиться к одному серверу с помощью некоторой библиотеки Java STOMP. Проблема в том, что библиотеки, которые я пробовал, требуют хост и порт как параметры подключения: например, с помощью ActiveMQ Stomp библиотека:
StompConnection connection = new StompConnection();
connection.open("host", port);
connection.connect(new HashMap<String, String>());
Если я укажу port
как 61613
, соединение будет успешным, но я сразу же удалю RabbitMQ, а не мой сервер (это не то, что я хочу). Если я укажу 8080
(или 80
), при подключении я получаю сообщение об ошибке
java.io.EOFException в java.io.DataInputStream.readByte(Неизвестный источник) at org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:137) на org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:77) на org.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:68) at org.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:139) at.... stomp.impl.activemq.ActiveMQStompDriver.connect(ActiveMQStompDriver.java:39) ... еще 25
и трассировка показывает, что это связано с тем, что кадр CONNECT
никогда не получает ожидаемый кадр CONNECTED
(на самом деле он ничего не получает).
Итак, я озадачен: я использую неправильный порт? или иметь дело с некоторой несовместимостью библиотеки? или мне нужно каким-то образом указать Tomcat, что я хочу обновить HTTP-соединение с WebSockets?
Если вышеуказанный вопрос трудно ответить, то это одинаково полезно: как подключиться к приложению Spring с помощью STOMP через канал обмена сообщениями WebSockets, запущенный на Tomcat, с помощью Java?