"message:Broker not available." 在 spring websocket 上执行 stomp 时出错
"message:Broker not available." error when implementing stomp over spring websocket
我正在使用 spring WebSocket、SockJs 和 Amazon MQ 构建示例聊天应用程序。当客户端订阅主题时,它会抛出 'broker not available' 异常。所有入站流量规则都在 AWS 安全组中正确设置,并且代理也有 stomp 支持。我正在关注这个 Spring Guide。
如果我使用内存代理,它工作正常。非常感谢您对此的帮助,以下是示例代码。
代理:Amazon MQ(内部使用 Active MQ)
版本:5.15.0
WebSocketConfig.java
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic")
.setRelayHost("***********.mq.us-east-2.amazonaws.com").setRelayPort(61614)
.setClientLogin("******").setClientPasscode("*****");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat-endpoint").withSockJS();
}
应用程序启动日志
.......
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Starting...
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Starting "system" session, StompBrokerRelay[ReactorNettyTcpClient[reactor.netty.tcp.TcpClientDoOn@7acb7b3e]]
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Started.
......
客户端
var socket = new SockJS('/chat-endpoint');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
stompClient.subscribe('/topic/message', function(message) {
displayMessage(message); });
});
浏览器控制台日志
Opening Web Socket... Web Socket Opened...
CONNECT accept-version:1.1,1.0 heart-beat:10000,10000
ERROR message:Broker not available. content-length:0
stomp.min.js:8 Whoops! Lost connection to
http://localhost:8080/testApp/chat-endpoint
我遇到了同样的问题。为了修复它,我稍微更改了 configureMessageBroker 方法:
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
.host("your-amazon-mq-host.amazonaws.com")
.port(61614)
.secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());
registry.setApplicationDestinationPrefixes("/app");
registry.enableStompBrokerRelay("/queue", "/topic")
.setAutoStartup(true)
.setSystemLogin("amazonmq-login")
.setSystemPasscode("amazonmq-pass")
.setClientLogin("amazonmq-login")
.setClientPasscode("amazonmq-pass")
.setTcpClient(client);
}
我正在使用 spring WebSocket、SockJs 和 Amazon MQ 构建示例聊天应用程序。当客户端订阅主题时,它会抛出 'broker not available' 异常。所有入站流量规则都在 AWS 安全组中正确设置,并且代理也有 stomp 支持。我正在关注这个 Spring Guide。
如果我使用内存代理,它工作正常。非常感谢您对此的帮助,以下是示例代码。
代理:Amazon MQ(内部使用 Active MQ)
版本:5.15.0
WebSocketConfig.java
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/topic")
.setRelayHost("***********.mq.us-east-2.amazonaws.com").setRelayPort(61614)
.setClientLogin("******").setClientPasscode("*****");
registry.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat-endpoint").withSockJS();
}
应用程序启动日志
.......
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Starting...
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Starting "system" session, StompBrokerRelay[ReactorNettyTcpClient[reactor.netty.tcp.TcpClientDoOn@7acb7b3e]]
INFO 14280 --- [alina-utility-1] o.s.m.s.s.StompBrokerRelayMessageHandler : Started.
......
客户端
var socket = new SockJS('/chat-endpoint');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
stompClient.subscribe('/topic/message', function(message) {
displayMessage(message); });
});
浏览器控制台日志
Opening Web Socket... Web Socket Opened... CONNECT accept-version:1.1,1.0 heart-beat:10000,10000
ERROR message:Broker not available. content-length:0
stomp.min.js:8 Whoops! Lost connection to http://localhost:8080/testApp/chat-endpoint
我遇到了同样的问题。为了修复它,我稍微更改了 configureMessageBroker 方法:
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
.host("your-amazon-mq-host.amazonaws.com")
.port(61614)
.secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());
registry.setApplicationDestinationPrefixes("/app");
registry.enableStompBrokerRelay("/queue", "/topic")
.setAutoStartup(true)
.setSystemLogin("amazonmq-login")
.setSystemPasscode("amazonmq-pass")
.setClientLogin("amazonmq-login")
.setClientPasscode("amazonmq-pass")
.setTcpClient(client);
}