我有一个带有 Stomp WS 的 Spring Web 应用程序,Spring v. 6.0.9,Windows 环境,Tomcat 10.1,JRE 17,我目前正在使用 SimpleBroker,但我需要对服务器进行集群化,然后我必须移动到外部 AMQP 服务器,我决定使用 RabbitMQ 和 Spring StompBrokerRelay。
这是我所做的步骤:
1) 将 MessageBroker 配置更改为 StompBrokerRelay
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/topic");
registry.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest")
.setAutoStartup(true);
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/myws").setAllowedOriginPatterns("*");
}
}
2)安装RabbitMQ和Stomp插件
我确信它正在监听,因为我在rabbitmq管理页面上找到了这个端口:
3)最后我尝试运行服务器和客户端
js 客户端代码与之前的 simplebroker 版本相比没有更改。
服务器端我看到这个日志:
[DEBUG] 2023-05-30 12:41:50.499 [clientOutboundChannel-11] NativeWebSocketSession - Closing StandardWebSocketSession[id=113fcf11-773c-8eaf-8fb9-eec01b0204f3, uri=ws://127.0.0.1:8080/myws]
[DEBUG] 2023-05-30 12:41:50.500 [clientOutboundChannel-11] LoggingWebSocketHandlerDecorator - StandardWebSocketSession[id=113fcf11-773c-8eaf-8fb9-eec01b0204f3, uri=ws://127.0.0.1:8080/myws] closed with CloseStatus[code=1002, reason=null]
[DEBUG] 2023-05-30 12:41:50.500 [clientOutboundChannel-11] SubProtocolWebSocketHandler - Clearing session 113fcf11-773c-8eaf-8fb9-eec01b0204f3
[DEBUG] 2023-05-30 12:41:50.501 [clientOutboundChannel-12] SubProtocolWebSocketHandler - No session for GenericMessage [payload=byte[0], headers={simpMessageType=OTHER, stompCommand=ERROR, nativeHeaders={message=[Broker not available.]}, simpSessionId=113fcf11-773c-8eaf-8fb9-eec01b0204f3}]
[DEBUG] 2023-05-30 12:41:50.501 [http-nio-8080-exec-8] DispatcherServlet - GET "/myws", parameters={}
[DEBUG] 2023-05-30 12:41:50.502 [http-nio-8080-exec-8] WebSocketHandlerMapping - Mapped to org.springframework.web.socket.server.support.WebSocketHttpRequestHandler@16e9324
[DEBUG] 2023-05-30 12:41:50.502 [http-nio-8080-exec-8] WebSocketHttpRequestHandler - GET /myws
[DEBUG] 2023-05-30 12:41:50.503 [http-nio-8080-exec-8] DispatcherServlet - Completed 101 SWITCHING_PROTOCOLS
[DEBUG] 2023-05-30 12:41:50.504 [http-nio-8080-exec-8] LoggingWebSocketHandlerDecorator - New StandardWebSocketSession[id=4d7e4bd4-e3dc-031f-177a-55a13fc27b2b, uri=ws://127.0.0.1:8080/myws]
在客户端日志中,我看到带有以下响应的 HTTP 101 请求:
在rabbitMQ管理中我没有看到任何连接。
我从 StompBrokerRelayMessageHandler 日志中得到的一个有趣的提示是,与 Rabbit 的“系统”连接似乎不断打开和关闭。
2023-06-01 15:02:36.156 DEBUG 15784 --- [ent-scheduler-2] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:36.190 TRACE 15784 --- [ent-scheduler-2] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:36.235 DEBUG 15784 --- [ent-scheduler-3] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:36.235 DEBUG 15784 --- [ent-scheduler-3] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:40.654 DEBUG 15784 --- [ent-scheduler-5] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:40.657 TRACE 15784 --- [ent-scheduler-5] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:40.667 DEBUG 15784 --- [ent-scheduler-6] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:40.667 DEBUG 15784 --- [ent-scheduler-6] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:41.248 DEBUG 15784 --- [ent-scheduler-8] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:41.250 TRACE 15784 --- [ent-scheduler-8] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:41.255 DEBUG 15784 --- [ent-scheduler-9] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:41.255 DEBUG 15784 --- [ent-scheduler-9] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:45.690 DEBUG 15784 --- [nt-scheduler-11] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:45.694 TRACE 15784 --- [nt-scheduler-11] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:45.706 DEBUG 15784 --- [nt-scheduler-12] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:45.706 DEBUG 15784 --- [nt-scheduler-12] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:46.262 DEBUG 15784 --- [ent-scheduler-2] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:46.263 TRACE 15784 --- [ent-scheduler-2] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:46.268 DEBUG 15784 --- [ent-scheduler-3] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:46.269 DEBUG 15784 --- [ent-scheduler-3] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:50.711 DEBUG 15784 --- [ent-scheduler-5] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:50.711 TRACE 15784 --- [ent-scheduler-5] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:50.716 DEBUG 15784 --- [ent-scheduler-6] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:50.717 DEBUG 15784 --- [ent-scheduler-6] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
2023-06-01 15:02:51.273 DEBUG 15784 --- [ent-scheduler-8] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection opened in session=_system_
2023-06-01 15:02:51.274 TRACE 15784 --- [ent-scheduler-8] o.s.messaging.simp.stomp.StompEncoder : Encoding STOMP CONNECT, headers={accept-version=[1.1,1.2], login=[guest], passcode=[PROTECTED], heart-beat=[10000,10000]}
2023-06-01 15:02:51.278 DEBUG 15784 --- [ent-scheduler-9] o.s.m.s.s.StompBrokerRelayMessageHandler : TCP connection to broker closed in session _system_
2023-06-01 15:02:51.279 DEBUG 15784 --- [ent-scheduler-9] o.s.m.s.s.StompBrokerRelayMessageHandler : Cleaning up connection state for session _system_
为了确保这与我的应用程序无关,我还查看了这个演示项目:https://github.com/djselzlein/spring-websockets-rabbitmq-demo/ 但它也有同样的问题。
你能帮助理解我缺少什么吗?
最佳答案
我克隆了演示项目并使用 Docker 启动了 RabbitMQ 并遇到了同样的问题。我必须激活 STOMP plugin来自 RabbitMQ。然后,STOMP 适配器监听端口 61613 上的所有接口(interface)。
您可以使用rabbitmq-plugins启用rabbitmq_stomp
我使用了以下 Dockerfile
FROM rabbitmq:latest
RUN rabbitmq-plugins enable rabbitmq_stomp
EXPOSE 15671 15672 61613
我再次尝试,错误消失了,希望您也是如此。
关于rabbitmq - 将 Spring WS Stomp 服务器从 SimpleBroker 迁移到 RabbitMQ StompBrokerRelay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76364814/