org.apache.activemq.broker.TransportConnection服务传输异常警告:java.io.EOFException。

5

在我的服务器日志中,偶尔会看到以下异常:

Aug 11, 2015 10:13:34 AM org.apache.activemq.broker.TransportConnection serviceTransportException
WARNING: Transport Connection to: tcp://127.0.0.1:55472 failed: java.io.EOFException

这些似乎不是实际发送到队列的事件或消息。它们只是随机发生的。

这是在Tomcat/Tomee上使用ActiveMQ。

配置ActiveMQ的代码如下:

我的ActiveMQ配置非常简单:

<?xml version="1.0" encoding="UTF-8"?>
<tomee>
    <!-- see http://tomee.apache.org/containers-and-resources.html -->

    <!-- activate next line to be able to deploy applications in apps -->
    <!-- <Deployments dir="apps" /> -->

    <Resource id="MyJmsResourceAdapter" type="ActiveMQResourceAdapter">
        BrokerXmlConfig =  broker:(tcp://localhost:61616)
        ServerUrl       =  tcp://localhost:61616
    </Resource>

    <Resource id="MyJmsConnectionFactory" type="javax.jms.ConnectionFactory">
        ResourceAdapter = MyJmsResourceAdapter
    </Resource>

</tomee>

我有一个简单的代码来定义队列:

@Resource(name = "myQueue")
private Queue barQueue;

@Resource
private ConnectionFactory connectionFactory;

/**
 * Push Message to Queue
 *
 * @param payload
 * @throws JMSException
 */
private void pushToQueue(Serializable payload) throws JMSException {
    Connection connection = connectionFactory.createConnection();
    connection.start();

    // Create a Session
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    // Create a MessageProducer from the Session to the Topic or Queu
    MessageProducer producer = session.createProducer(barQueue);
    producer.setDeliveryMode(DeliveryMode.PERSISTENT);

    // Create a message
    ObjectMessage message = session.createObjectMessage(payload);

    // Tell the producer to send the message
    producer.send(message);

    connection.close();
}

我可以正常看到日志中的信息。

但我会随机地看到这个EOFException错误。

而且这种错误发生时,我并没有向队列中添加任何消息。


EOFException(文件结尾异常)意味着程序意外到达了文件的结尾。据我所知,如果没有看到您的任何代码,我们无法提供有效的帮助。 - lacraig2
我已经添加了用于配置队列和向队列添加消息的代码,以及设置ActiveMQ Broker的服务器配置。 - seba.wagner
我还可以补充一点,通常在最后一条消息被放入队列后的14-15分钟左右,我会看到这个异常。看起来像是某种超时。但我没有看到任何消息未能被放入队列。而且堆栈跟踪指向了一个框架的一部分,所以不是由我的代码引发的。 - seba.wagner
我在这里也有同样的问题多年了,但还没有合理的解释。 - Leo
请您能否在堆栈跟踪中再发一些内容,例如原因。 - SubOptimal
2个回答

1
这通常是由于客户端没有正确清理连接所致。调用connection.close()并不完整。此外,与61616不同的端口号是端口对的特定于客户端的端口号。
JMS连接清理的最佳实践:
} finally {
    if(producer != null) {
        try { producer.close(); } catch (JMSException e) { log.. bad thing }
    }
    if(session != null) {
        try { session.close(); } catch (JMSException e) { log.. bad thing }   
    }
    if(connection != null) {
        try { connection.close(); } catch (JMSException e) { log.. bad thing } 
    }  
    producer = null;
    session = null;
    connection = null;
}

0

您的ActiveMQ配置显示您正在打开到代理的61616端口的连接,但记录的错误指示客户端使用了55472端口。必须有其他客户端正在建立连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接