首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StompBrokerRelayMessageHandler -传输失败: java.lang.IllegalStateException:没有可用的TcpConnection

StompBrokerRelayMessageHandler -传输失败: java.lang.IllegalStateException:没有可用的TcpConnection
EN

Stack Overflow用户
提问于 2019-09-18 12:28:59
回答 1查看 877关注 0票数 6

我们在我们的项目中使用STOMP中继(外部代理- ActiveMQ 5.13.2)参见https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-handle-broker-relay

我们使用以下堆栈:

代码语言:javascript
复制
org.springframework:spring-jms:jar:5.1.8.RELEASE
org.springframework:spring-messaging:jar:5.1.8.RELEASE
io.projectreactor:reactor-core:jar:3.2.8.RELEASE
io.projectreactor.netty:reactor-netty:jar:0.8.6.RELEASE
io.netty:netty-all:jar:4.1.34.Final

有时(比方说每两周一次),我们可以在tomcat catalina.out日志中观察到错误。

代码语言:javascript
复制
2019-08-21 13:38:58,891 [tcp-client-scheduler-5] ERROR com.*.websocket.stomp.SimpMessagingSender  - BrokerAvailabilityEvent[available=false, StompBrokerRelay[ReactorNettyTcpClient[reactor.netty.tcp.TcpClientDoOn@219abb46]]]
2019-08-21 13:38:58,965 [tcp-client-scheduler-1] ERROR org.springframework.messaging.simp.stomp.StompBrokerRelayMessageHandler  - Transport failure: java.lang.IllegalStateException: No TcpConnection available

在该错误之后,STOMP通信中断(system连接-单个TCP连接不可用)

当我们更新堆栈时,似乎一切都开始了:

代码语言:javascript
复制
org.springframework:spring-jms:jar:5.0.8.RELEASE
org.springframework:spring-messaging:jar:5.0.8.RELEASE
io.projectreactor:reactor-core:jar:3.1.8.RELEASE
io.projectreactor.netty:reactor-netty:jar:0.7.8.RELEASE
io.netty:netty-all:jar:4.1.25.Final

ActiveMQ版本未更改

在春季报告了一个错误,当system连接丢失时,自动重新连接失败,请参阅:https://github.com/spring-projects/spring-framework/issues/22080

现在有三个问题:

如何使这个问题更加reproducible?

  • How来修复这个重新连接行为?:)

  • 如何防止失去这个连接?:)

编辑23.09.2019

发生错误后,端口61613(STOMP)的TCP堆栈如下(请注意CLOSE_WAIT状态):

代码语言:javascript
复制
netstat -an | grep 61613
tcp6       0      0 :::61613                :::*                    LISTEN
tcp6       2      0 127.0.0.1:49084         127.0.0.1:61613         CLOSE_WAIT
EN

回答 1

Stack Overflow用户

发布于 2020-01-24 15:45:58

我不能说我有足够的信息来回答你的问题,尽管我有一些信息可以帮助你找到前进的方向。

ActiveMQ通常在宿主/分布式环境中使用,因此加载和缩放应该始终是考虑的问题。

大多数dbs/消息队列/等等。即使是在AWS上(通过请求更高的限制),也需要对负载进行某种类型的调优,尽管其中的大部分都是由主机提供商处理的。

但我离题了。

在这种情况下,您似乎使用TCP传输来处理队列:

https://activemq.apache.org/tcp-transport-reference

正如您所看到的,所有这些设置都可以被调优并具有默认值。

因此,在记录从spring端连接到AMQ的问题时,您需要缩小错误发生的时间,然后查看AMQ指标和日志。

如果你没有对AMQ的监控,我建议:

https://activemq.apache.org/how-can-i-monitor-activemq

  • Look在您的主机服务提供商的度量和停机时间。例如,如果使用AWS,就会有非常详细的事件日志来记录网络故障或VPC或跨区域隧道、网络流量进出等方面的瞬间问题。

为您的分布式系统设置正确的工具,使您的团队能够搜索/查找错误/日志(并记录如何做到这一点)是非常有帮助的。此外,(对于成熟的系统)是在监控的顶部添加一个层,这样您的系统就可以在出现问题时告诉您,而不是反过来(去寻找问题)。

这可能有点冗长--但这一切都会导致我问您是否有AMQ系统故障时的日志/度量标准。如果你这样做了,请张贴他们!

我提出这些建议是因为:

没有提供关于负载预期、负载可变性或系统中负载是考虑因素的信息(通过故障排除,steps).

  • Logs/errors提供的完全来自客户端的信息)。

  • 错误的重现性不频繁且不一致,因此几乎可以是任何事情(内存泄漏、负载问题等),因此需要进行监视。

还可以考虑在Spring端添加spring来监视您的消息客户端,因为客户机连接池和高级设置也经常有限制/设置,特别是当您缩放/缩小实例大小时,等等。您的实例将处理更多/更少的负载,您的客户端库可能需要一些设置调优。

https://www.baeldung.com/spring-boot-actuators

Exposing metrics about current Websocket connections with Spring

您还可以捕获异常并删除和重新创建连接/设置--尽管这不是我建议的第一件事,因为在连接失败时不了解更多的情况和状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57992857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档