MessageDrivenBean:AMQ122000:我正在关闭您打开的 JMS 连接
MessageDrivenBean: AMQ122000: I''m closing a JMS connection you left open
当通过 MDB 发送一些消息时,会出现一些关于未关闭的 JMS 连接的警告,这些连接随后会被 ActiveMQ 关闭。
MDB 得到一个注入的消息处理程序,它得到一个注入的回复发送器,下面给出了方法。
这是我收到的警告:
[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 次,前三次有效,然后一次抛出四次警告(可能也针对之前的每次调用),依此类推几次。
每次我在 webapp 中执行特定任务时,这都是可重现的。
我不知道这里出了什么问题。
任何建议将不胜感激。提前致谢。
我认为问题在于虽然在 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);
) {
我不再收到警告。
感谢收听。
当通过 MDB 发送一些消息时,会出现一些关于未关闭的 JMS 连接的警告,这些连接随后会被 ActiveMQ 关闭。 MDB 得到一个注入的消息处理程序,它得到一个注入的回复发送器,下面给出了方法。
这是我收到的警告:
[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 次,前三次有效,然后一次抛出四次警告(可能也针对之前的每次调用),依此类推几次。 每次我在 webapp 中执行特定任务时,这都是可重现的。
我不知道这里出了什么问题。
任何建议将不胜感激。提前致谢。
我认为问题在于虽然在 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);
) {
我不再收到警告。 感谢收听。