Я получил веб-приложение, реализованное в Spring с использованием STOMP через WebSockets Messaging, подобное тому, что описано здесь (с RabbitMQ на сервере). Он работает на Tomcat, и я могу подключиться к приложению, используя обычные URL-адреса (например, http://host/server/
). Мне также дали демо-клиент - страницу JSPX, которая использует Modernizr WebSockets и 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 (Неизвестный источник) в org.apache.activemq.transport.stomp.StompWireFormat.unmarshal (StompWireFormat.java:137) в org.apache.activemq.transport.stompnection. .receive (StompConnection.java:77) в org.apache.activemq.transport.stomp.StompConnection.receive (StompConnection.java:68) в org.apache.activemq.transport.stomp.StompConnection.connect (StompConnection.java: ) at .... stomp.impl.activemq.ActiveMQStompDriver.connect (ActiveMQStompDriver.java:39) ... еще 25
и трассировка показывает, что это происходит потому, что CONNECT
кадр никогда не получает ожидаемого CONNECTED
кадра (фактически, он ничего не получает обратно).
Поэтому я озадачен: я использую не тот порт? или иметь дело с несовместимостью библиотек? или мне нужно каким-то образом указать Tomcat, что я хочу обновить HTTP-соединение до WebSockets?
Если на вышеприведенный вопрос трудно ответить, то этот одинаково полезен: как мне подключиться к приложению Spring с помощью STOMP через канал обмена сообщениями WebSockets, запущенный на Tomcat с использованием Java?