消息中间件JMS异常EOFException
异常场景
在 ssm+dubbo分布式项目时,使用消息中间件时,在运行时出现了这个错误.
异常信息
Caused by: org.apache.activemq.ConnectionFailedException: The JMS connection has failed: java.io.EOFException
at org.apache.activemq.ActiveMQConnection.checkClosedOrFailed(ActiveMQConnection.java:1448)
at org.apache.activemq.ActiveMQConnection.createSession(ActiveMQConnection.java:328)
at sun.reflect.GeneratedMethodAccessor78.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.invoke(SingleConnectionFactory.java:620)
at com.sun.proxy.$Proxy50.createSession(Unknown Source)
at org.springframework.jms.support.JmsAccessor.createSession(JmsAccessor.java:192)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:475)
... 73 more
Caused by: java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:392)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:268)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:240)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:232)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
... 1 more
分析过程
在最初的时候,我以为是因为点对点模式下导致不能正常读取导致的.后来发现在发布订阅模式下也会出现这个异常.
经过在网上查找一些相关资料. 但对于这个异常,网上似乎并没有太多的可行解决方案.
其实很多人都会在运行时遇到EOFException,但是这个异常不是必须声明的,同时也说明是正常运行结束的标记.
为什么这么说呢?
EOF表示读到了文件尾( String str = dis.readUTF(); ,客户端已经断开,后面已经没有内容可以读了),发送结束自然连接也就断开了。
解决方案
- 检查一下客户端是否断开,不能正常读取到数据;
- 打个断点调试一下,读取的数据是否有异常,根据断点提示的数据和数据库的数据做对比.
- 重新启动一下客户端和服务.
这是本人遇到的异常和解决方案.原因是断开了连接导致读取数据有异常.