最近出现开发中出现了一个问题:
创建JMS连接工厂和目的地之后,可以正常的发送接收消息。
但是当我把JMS连接工厂删除的时候,ActiveMQ的后台会抛出
INFO | Transport failed: java.io.EOFException
log文件里的信息:
2013-03-08 15:34:13,977 | INFO | Transport failed: java.io.EOFException | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///127.0.0.1:50643整个问题Google查了两天,还是没有解决。我的尝试如下:
1.Google时查到http://blog.csdn.net/zeo112140/article/details/8016209?reload
文章说“MQ配置文件里配置了ProducerFlowControl='true',而且memorylimit过小导致的。”我按照文章的说法做了修改,没有起做用。2.在官方论坛和Wiki里看到了关于 <transportConnector name="openwire" uri="tcp://localhost:61616"/>这个的url后面加上超时时间限制,设置为0时表示不限制wireFormat.maxInactivityDuration=0,不起作用。3.从代码debug,发现ActiveMQ会起两个线程InactivityMonitor,一起在不断分析,如果有异常应该是该类抛出的。但是每次debug时先把断点加到EOFException类里,其实并不抛出异常,但真正做删除操作时,该断点又没有在此断希望高手指点!谢谢!
activemqactivemqEOFExceptionjms
创建JMS连接工厂和目的地之后,可以正常的发送接收消息。
但是当我把JMS连接工厂删除的时候,ActiveMQ的后台会抛出
INFO | Transport failed: java.io.EOFException
log文件里的信息:
2013-03-08 15:34:13,977 | INFO | Transport failed: java.io.EOFException | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///127.0.0.1:50643整个问题Google查了两天,还是没有解决。我的尝试如下:
1.Google时查到http://blog.csdn.net/zeo112140/article/details/8016209?reload
文章说“MQ配置文件里配置了ProducerFlowControl='true',而且memorylimit过小导致的。”我按照文章的说法做了修改,没有起做用。2.在官方论坛和Wiki里看到了关于 <transportConnector name="openwire" uri="tcp://localhost:61616"/>这个的url后面加上超时时间限制,设置为0时表示不限制wireFormat.maxInactivityDuration=0,不起作用。3.从代码debug,发现ActiveMQ会起两个线程InactivityMonitor,一起在不断分析,如果有异常应该是该类抛出的。但是每次debug时先把断点加到EOFException类里,其实并不抛出异常,但真正做删除操作时,该断点又没有在此断希望高手指点!谢谢!
activemqactivemqEOFExceptionjms
解决方案 »
- struts2线程同步问题
- 求ognl表达式中select标签的用法
- MyEclipse做jsp时有source视图没
- 怎样用htmlparser取得标签对之间的内容?
- 关于EJB事务的问题
- 转javaeye一个比较难的问题:业务要求动态的创建表、更新表结构,超出了hibernate的能力? (作者:bromon)
- 问一个Struts下拉框的问题
- struts中formbean的问题
- js如何删除分页的数据
- Struts2 + Spring3 + MyBatis集成
- jasperreport linux环境导出PDF 为什么中文标题可以显示,但图表中的中文都出不来
- java 大量数据导出为Excel 内存溢出
希望对你有帮助;你的这种错误,我没有碰到过。
activeMq应用上的这种问题,一般别人很难回答,只能自己解决。多数是应用不当导致;
谢谢朋友,我的情况是写了一个用例,向J2EE应用服务器中创建了连接工厂QueueConnectionFactory和目的地,之后用一个servlet发送了消息,但是并没有消费者消费这个消息。紧接着就执行了删除这个连接工厂的操作,跟代码的时候是到了关闭连接池的物理连接的时候,到了ActiveMQ的ActiveMQConnection这个类的close方法内,此时ActiveMQ的后台会打印一个EOFException.还在分析中。谢谢
还有消息没有被消费,在jms规范中对于queue这种点对点的消息,是不需要消息一定被消费的吧?
根据我以前使用ActiveMq的经验,.net下API有个Bug:新建一个连接会新建一个线程,但是close的时候不会kill这个线程,所以如果不断建立连、关闭连接,实际上会导致应用程序的线程数不断增加,从而出现问题;
但是java下的api我没有反编译看过,不知道是否有类似的bug。
总而言之了,像这样开源的东西,尽量按照最经典的方式去使用,除非你事先进行了较为全部的测试。
SOCKET_CLOSE.execute(new Runnable() {
public void run() {
try {
socket.close();
} catch (IOException e) {
LOG.debug("Caught exception closing socket",e);
}finally {
latch.countDown();
}当socket.close方法执行后,ActiveMQ的后台会打印EOFException.而且现在的情况是,如果我的ConnectionFactory的最小连接数设置默认是8,我的用例会使用一个连接,还有7个是空闲的,此时执行删除连接工厂的操作,后台会打印7个EOFException.当最小连接数设置成2个时,后台会打印一个EOFException.应该是和空闲连接有关系,但具体原因还是不清楚。哎再次感谢你的回复。