ActiveMQ日志被警告占满:tcp连接失败警告解析与解决求助
ActiveMQ持续出现EOFException警告的解析与解决方法
兄弟,我来帮你拆解这个烦人的警告问题!先看你贴的日志:
2018-04-26 16:43:22,072 | WARN | Transport Connection to: tcp://127.0.0.1:60736 failed: java.io.EOFException | org.apache.acti...
这个警告到底啥意思?
简单说就是ActiveMQ和本地127.0.0.1:60736这个端口的TCP连接被突然掐断了,而且是对方没按规矩来——正常TCP断开会发关闭包,结果这边直接没数据了,ActiveMQ读数据的时候碰到了“文件末尾”(EOF),所以抛出这个警告。这种情况在本地连接里出现,大概率是客户端程序或系统层面的问题,不是网络链路的锅。
可能的诱因有这些
- 本地连接ActiveMQ的客户端(比如你的业务程序、监控工具)突然崩溃、被强制杀死,没来得及调用正常的断开连接方法
- Windows Server 2012的TCP栈出了小问题,比如端口被占用、系统资源(CPU/内存)不足导致连接被强制回收
- ActiveMQ的TCP连接配置不合理,比如超时时间太短、没开心跳,导致连接被误判为失效断开
- 防火墙或杀毒软件主动拦截了这个本地连接
给你一套解决步骤,按顺序试
1. 先查客户端程序
- 看看本地连ActiveMQ的所有程序,有没有异常退出的情况,翻它们的日志,找崩溃、强制关闭的记录
- 确保客户端在停止的时候,一定要调用
connection.close()这类正规的断开方法,别直接杀进程
2. 优化ActiveMQ的TCP配置
修改conf/activemq.xml里的传输连接器配置,重点加心跳和调整超时:
<transportConnectors> <!-- 原来的tcp配置改成这样,参数按需调整 --> <transportConnector name="tcp" uri="tcp://0.0.0.0:61616?wireFormat.maxInactivityDuration=30000&wireFormat.maxInactivityDurationInitalDelay=60000"/> </transportConnectors>
解释下参数:
maxInactivityDuration=30000:如果30秒内没有数据传输,就自动发心跳包保活maxInactivityDurationInitalDelay=60000:刚建立连接的前60秒不检测心跳,避免刚连上就触发误判
3. 检查Windows系统层面的问题
- 打开命令行,输入
netstat -ano,找60736端口对应的进程ID,看看是不是有异常进程在占用,或者本地端口是不是快耗尽了 - 暂时关掉Windows防火墙和杀毒软件,测试下警告会不会消失,排除拦截的可能
- 打开任务管理器,看看CPU、内存、磁盘的使用率,如果资源跑满了,系统会强制回收连接资源,得先解决资源不足的问题
4. 临时缓解日志爆炸的问题(治标不治本)
如果暂时找不到根因,先把这个警告的日志级别调低,别让它占满日志文件。修改conf/log4j.properties:
找到这行:
log4j.logger.org.apache.activemq.transport=WARN
改成:
log4j.logger.org.apache.activemq.transport=ERROR
这样就不会记录这个警告了,但这只是临时方案,还是得找到根本原因解决,不然可能藏着其他问题。
内容的提问来源于stack exchange,提问作者cnu
相关产品推荐
相关产品推荐

