【问题标题】:StompBrokerRelayMessageHandler - many log errorsStompBrokerRelayMessageHandler - 许多日志错误
【发布时间】:2015-08-18 12:09:06
【问题描述】:
我们在 stomp 和 sockjs 上使用带有 tomcat 7 的 spring websockets。
我们的日志充满了这样的错误:
[WEBAPP] 16 Aug 2015 08:11:24 ERROR StompBrokerRelayMessageHandler - Failed to forward DISCONNECT session=7ufvyfvf
[WEBAPP] 16 Aug 2015 08:13:47 ERROR StompBrokerRelayMessageHandler - Failed to forward DISCONNECT session=d017bxnq
任何想法为什么?我们怎样才能消除\减轻这种情况?
【问题讨论】:
标签:
java
spring
websocket
stomp
【解决方案1】:
对不起,我有点晚了。然而,遇到了相同/相似的问题。我猜你正在使用像 rabbitmq 这样的消息代理。
ERROR StompBrokerRelayMessageHandler:584 - TCP connection failure in session uwdglayp: Transport failure: Connection reset by peer
有时是转发失败,通常是连接失败。
我做了什么?将日志记录级别更改为调试后,我发现 spring 应用程序向消息代理发送了两条 DISCONNECT 消息。
在客户端调用 stomp.disconnect() 会导致发送 DISCONNECT 消息 (STOMP) 并关闭套接字 (socketJS)。
StompBrokerRelayMessageHandler 将 DISCONNECT 消息通知 Broker 并另外发送一个 DISCONNECT,因为套接字已被客户端关闭,两者都是异步的。 Spring不可能捕捉到第二次断开,第二次断开会发生错误。
什么指定STOMP? (DISCONNECT SPEC)
客户端可以通过关闭套接字随时断开与服务器的连接,但不能保证服务器已经接收到之前发送的帧
我的解决方案:
修改STOMP Client,直接关闭socket,不发送DISCONNECT消息(客户端会关闭socket)
另一种解决方案:
只发送一个 DISCONNECT 消息(spring 将关闭套接字)
我会检查 STOMP 的其他实现以找到更好的解决方案。