Как настроить веб-сокеты Spring с помощью CloudAMQP

У меня есть приложение Spring Boot, которое я развертываю в экземпляре Cloud Foundry (BlueMix). Я привязал экземпляр CloudAMQP к приложению и хотел бы использовать его для отправки сообщений STOMP. Мне не удалось правильно настроить класс StompBrokerRelayRegistration для успешного подключения экземпляра RabbitMQ в CloudAMP. Я позвонил

config.enableStompBrokerRelay("/topic", "/queue");

Но это попыталось подключиться к локальному хосту. Я думал, что он может попытаться использовать мой bean-компонент org.springframework.amqp.rabbit.connection.ConnectionFactory, но, похоже, нет.

Затем я попытался вызвать setRelayHost, setRelayPort, setSystemLogin, setSystemPasscode и setVirtualHost с информацией в VCAP_SERVICES. После этого Spring, похоже, пытается подключиться к экземпляру RabbitMQ, но, судя по журналам, соединение немедленно закрывается, говоря:

Сброс соединения пиром

. Кто-нибудь знает, что я могу делать неправильно?

Обновить

Очевидно, я использовал неправильный порт. Использование порта 5672 приводит к немедленному закрытию соединения. Если я использую порт 61613, соединение будет установлено. Однако, как только браузер пытается перейти и установить веб-сокет, возникает следующее исключение

    java.lang.IllegalStateException: The WebSocket session has been closed and no method (apart from close()) may be called on a closed session
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.apache.tomcat.websocket.WsSession.checkState(WsSession.java:649)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.apache.tomcat.websocket.WsSession.getUserPrincipal(WsSession.java:578)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.getPrincipal(StandardWebSocketSession.java:123)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.getPrincipal(WebSocketServerSockJsSession.java:73)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.messaging.StompSubProtocolHandler.afterSessionEnded(StompSubProtocolHandler.java:364)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.clearSession(SubProtocolWebSocketHandler.java:352)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.afterConnectionClosed(SubProtocolWebSocketHandler.java:347)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.handler.WebSocketHandlerDecorator.afterConnectionClosed(WebSocketHandlerDecorator.java:85)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.afterConnectionClosed(LoggingWebSocketHandlerDecorator.java:71)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.afterConnectionClosed(ExceptionWebSocketHandlerDecorator.java:89)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.close(AbstractSockJsSession.java:289)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.handler.WebSocketSessionDecorator.close(WebSocketSessionDecorator.java:158)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageToClient(StompSubProtocolHandler.java:287)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:306)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at org.springframework.messaging.support.ExecutorSubscribableChannel$1.run(ExecutorSubscribableChannel.java:70)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
2014-05-14T22:17:53.70-0400 [App/0]   OUT   at java.lang.Thread.run(Thread.java:745)

Над этим я вижу это предупреждение

2014-05-14T22:17:53.69-0400 [App/0]   OUT 2014-05-15 02:17:53.698  WARN 31 --- [tboundChannel-1] o.s.w.s.m.SubProtocolWebSocketHandler    : Ignoring protocol in WebSocket session after failure to obtain it: java.lang.IllegalStateException: The WebSocket session has been closed and no method (apart from close()) may be called on a closed session
2014-05-14T22:17:53.70-0400 [App/0]   OUT 2014-05-15 02:17:53.709 ERROR 31 --- [tboundChannel-1] w.s.h.ExceptionWebSocketHandlerDecorator : Unhandled error for ExceptionWebSocketHandlerDecorator [delegate=LoggingWebSocketHandlerDecorator [delegate=org.springframework.web.socket.messaging.SubProtocolWebSocketHandler@646eb571]]

Кто-нибудь знает, что здесь происходит не так?


person Ryan Baxter    schedule 15.05.2014    source источник


Ответы (1)


Разобрался, чего мне не хватало. В дополнение к вызову setSystemLogin и setSystemPasscode мне нужно было вызвать setClientLogin и setClientPasscode в StompBrokerRelayRegistration. После этого мое подключение WebSocket из браузера к приложению в Cloud Foundry заработало, и Spring смог использовать экземпляр RabbitMQ из CloudAMQP для отправки сообщений STOMP.

person Ryan Baxter    schedule 15.05.2014