【问题标题】:Huge established number of socket in activemqactivemq 中已建立的大量套接字
【发布时间】:2018-02-06 07:57:05
【问题描述】:

我遇到的问题是,有大量已建立的带有 activemq 的套接字。

根据 ActiveMQ 文档,socket 会因为不活动而关闭。但是在我的应用程序中,一段时间后,由于不活动,我有一个巨大的套接字连接。这是我的设置:

客户端配置有soTimeout 30s,connectionTimeout 10s

代理配置的 maxInactivityDuration 为 30 秒

在日志文件中,我遇到以下异常,但我无法理解为什么套接字没有按照 activemq 文档关闭。

[WARN ] [20/Nov/17 23:58:06.473] [Transport] - 传输连接 到:tcp://10.227.129.219:34896 失败: org.apache.activemq.transport.InactivityIOException:通道是 不活动(未尝试连接)太长(> 30000): tcp://10.227.129.219:34896

提到了活动 mq 文档here

使用默认值;如果没有数据被写入或读取 连接 30 秒,InactivityMonitor 启动。 InactivityMonitor 抛出 InactivityIOException 并关闭 与连接关联的传输

供您参考,我使用的是activemq 5.13.3。下面是netstat 命令的截图。

netstat -an | grep 9999
tcp        0      0 X.X.X.X:9999           Y.Y.Y.Y:38200        ESTABLISHED 
tcp        0      0 X.X.X.X:9999           Y.Y.Y.Y:44582        ESTABLISHED 
tcp        0      0 X.X.X.X:9999           Y.Y.Y.Y:41278        ESTABLISHED
... (few hundreds in total) 

【问题讨论】:

  • 我不清楚不活动是什么意思?应用程序是否没有响应(因此它们的 tcp 连接良好(如套接字良好且应用程序冻结)但应用程序超时)?或者就像网络问题和 tcp 连接本身搞砸了?所以如果你想节省网络,你可以在没有发送应用程序数据但仍然 tcp 保持活动状态的情况下关闭套接字。
  • "使用默认值;如果 30 秒内没有从连接写入或读取数据,则 InactivityMonitor 启动。InactivityMonitor 抛出 InactivityIOException 并关闭与连接关联的传输"
  • 该评论无助于您找到答案
  • 哦原来问题中不存在,所以我用 activemq 文档中的 blockquote 编辑了问题。我担心的是 InactivityMonitor 进程,因为它已经启动,相关的套接字也应该关闭。但是,套接字仍处于建立阶段。

标签: java sockets activemq


【解决方案1】:

根据您共享的日志文件,TCP 握手已完成,然后 activemq 协议(应用程序级别)正在等待建立连接。由于任何问题(例如网络连接等),无法建立连接。我猜您的 tcp keeplive 配置已启用。因此,TCP 连接没有关闭,应用程序(例如 activemq)也没有关闭它。

【讨论】:

  • 谢谢,我已经解决了问题,你提到了一些正确的点。
  • 如果启用了 TCP keepalive,则连接关闭,或者更确切地说是重置。它实际上并没有“保持”连接“活着”,尽管它的名字,它检测到死的。最终。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2021-05-09
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
相关资源
最近更新 更多