MessageDrivenBean:AMQ122000:我正在关闭你打开的JMS连接

时间:2017-06-05 18:26:59

标签: java jms jboss7.x message-driven-bean

通过MDB发送一些消息时,有一些关于未关闭的JMS连接的警告,然后由ActiveMQ关闭。 MDB得到一个messageHandler注入,它获得了一个回复者注入的方法,如下所示。

这是我得到的警告:

[org.apache.activemq.artemis.jms.client] (Finalizer) AMQ122000: I''m closing a JMS connection you left open. Please make sure you close all JMS connections explicitly before letting them go out of scope! see stacktrace to find out where it was created: java.lang.Exception
at org.apache.activemq.artemis.jms.client.ActiveMQConnection.<init>(ActiveMQConnection.java:155)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:750)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:233)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:229)
[...]

当try-block结束时(因此直接在log.debug(..)之后),在以下代码中发生警告(不是每次):

    private Message doSendAndReturn(XmlMessageCreator messageCreator) throws JMSException {
    Message message = null;
    try (Session session = cf.createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);) {
        MessageProducer producer = session.createProducer(jmsReplyQueue);
        message = messageCreator.createMessage(session);

        producer.send(message);
        log.debug("JMSTemplate sended message to myEnvironment with ID "
                + message.getJMSMessageID()
                + "\n Using Thread "
                + Thread.currentThread().getName());
    }
    return message;
}

我仍然读到,当没有引用连接工厂但“cf”是通过上下文定义的全局单例变量时,也会发生这些警告:

    @Resource(lookup = "java:/myProject_myEnvironment_factory")
private ConnectionFactory cf;

在log.debug(...)上设置断点时,我可以看到它似乎有效,但有时却没有。这个方法被调用大约7次,而前三次工作,然后一次抛出警告四次(可能也是每次前一次调用),依此类推几次。 每次我在webapp中执行特定任务时,这都是可重现的。

我不知道这里出了什么问题。

任何建议都会感激不尽。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为问题在于虽然会话对象是在try-with-resource部分中定义的,但是在try-with-resource部分中没有连接的显式变量。

更改后:

 try (Session session = cf.createConnection().createSession(false, Session.AUTO_ACKNOWLEDGE);) {

为:

 try (
            Connection connection = cf.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        ) {

我不再收到警告了。 谢谢你的聆听。