rabbitmq - 将 Spring WS Stomp 服务器从 SimpleBroker 迁移到 RabbitMQ StompBrokerRelay

标签 rabbitmq stomp spring-ws

我有一个带有 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管理页面上找到了这个端口:

enter image description here

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 请求:

enter image description here

在rabbitMQ管理中我没有看到任何连接。

enter image description here

我从 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/

相关文章:

c# - 如何在发布者中获得事件响应?

javascript - 错误: Econn is refused in Node.js

swift - Swift Stomp客户端与Spring兼容

轨道 cometd 服务器和 stomp 的 PHP 代码

java - 如何测试需要soapHeaders的Spring-WS Web服务?

java - 定制 Java 包 JAXB wsimport

rabbitmq - 在 RabbitMQ 中手动确认消息

spring - 无法使用 Spring Websocket STOMP 发送特定于用户的消息

java - 获取 com.sun.xml.wss.XWSSecurityException 的 NoClassDefFoundError

rabbitmq - RabbitMQ 中的磁盘空间问题