最近出现开发中出现了一个问题:
创建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

解决方案 »

  1.   

    http://www.cnblogs.com/CopyPaster/archive/2012/04/27/2473179.html
    希望对你有帮助;你的这种错误,我没有碰到过。
    activeMq应用上的这种问题,一般别人很难回答,只能自己解决。多数是应用不当导致;
      

  2.   


    谢谢朋友,我的情况是写了一个用例,向J2EE应用服务器中创建了连接工厂QueueConnectionFactory和目的地,之后用一个servlet发送了消息,但是并没有消费者消费这个消息。紧接着就执行了删除这个连接工厂的操作,跟代码的时候是到了关闭连接池的物理连接的时候,到了ActiveMQ的ActiveMQConnection这个类的close方法内,此时ActiveMQ的后台会打印一个EOFException.还在分析中。谢谢
      

  3.   

    通过ActiveMQ的admin控制台看到connection处于活动状态。这个时候关闭连接是否会有问题呢?
    还有消息没有被消费,在jms规范中对于queue这种点对点的消息,是不需要消息一定被消费的吧?
      

  4.   

    ActiveMq使用的时候要注意一点:长连接使用(短连接下ActiveMq无任何性能可言)。
    根据我以前使用ActiveMq的经验,.net下API有个Bug:新建一个连接会新建一个线程,但是close的时候不会kill这个线程,所以如果不断建立连、关闭连接,实际上会导致应用程序的线程数不断增加,从而出现问题;
    但是java下的api我没有反编译看过,不知道是否有类似的bug。
    总而言之了,像这样开源的东西,尽量按照最经典的方式去使用,除非你事先进行了较为全部的测试。
      

  5.   

    谢谢回复。我今天又debug了一次代码,问题是出现在TcpTransport这个类里:  final CountDownLatch latch = new CountDownLatch(1);
                    
                    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.应该是和空闲连接有关系,但具体原因还是不清楚。哎再次感谢你的回复。