【问题标题】:MessageDrivenBean: AMQ122000: I''m closing a JMS connection you left openMessageDrivenBean:AMQ122000:我正在关闭您打开的 JMS 连接
【发布时间】:2017-06-06 19:25:04
【问题描述】:

当通过 MDB 发送一些消息时,会有一些关于未关闭的 JMS 连接的警告,然后这些连接会被 ActiveMQ 关闭。 MDB 得到一个 messageHandler 注入,它得到一个 replysender 注入,其方法如下。

这是我得到的警告:

[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 块完成时(因此直接在 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 次,而前 3 次工作,然后一次抛出警告四次(可能也是每次之前的调用),依此类推几次。 每次我在 web 应用程序中执行特定任务时,这都是可重现的。

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

任何建议将不胜感激。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    我认为问题在于,虽然会话对象是在 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);
            ) {
    

    我不再收到警告。 感谢收听。

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 2011-11-24
      • 2016-12-04
      相关资源
      最近更新 更多