wildfly 10-发送jms消息会引起警告



当通过JMS主题发送消息时,我经常会收到以下警告:

2016-07-22 14:32:02,418 WARN  [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.createContext(ActiveMQConnectionFactory.java:255)
at org.wildfly.extension.messaging.activemq.deployment.JMSContextProducer$JMSContextWrapper.create(JMSContextProducer.java:195)
at org.wildfly.extension.messaging.activemq.deployment.JMSContextProducer$JMSContextWrapper.getDelegate(JMSContextProducer.java:235)
at org.wildfly.extension.messaging.activemq.deployment.JMSContextProducer$JMSContextWrapper.createProducer(JMSContextProducer.java:270)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:139)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:295)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:249)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:236)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:395)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:202)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)

我的代码:

@Inject
@JMSConnectionFactory("java:/ConnectionFactory")
private JMSContext context;
@Resource(lookup = "java:/jms/topic/MyTopic", type = Long.class)
private Topic topic;
public void sendMessage(Event event) {
    try {
        context.createProducer().send(topic, 1L);
    } catch (Exception e) {;
        log.error("Error while sending message to the JMS topic. Will retry later.", e);
    }
}

知道吗?我在谷歌上还找不到任何东西。

根据JMSContext javadoc,当连接由应用程序服务器管理时,应该自动关闭连接。

我认为该消息清楚地解释了这个问题。可能您只需要调用close()或对您创建的生产者进行某种调用。

编辑:

事实上,需要关闭的不是生产,而是上下文。

来自文档(https://docs.oracle.com/javaee/7/api/javax/jms/JMSContext.html):

所有这些JMSContext对象都是应用程序管理的,必须在不再需要时通过调用其close方法关闭。

关于制片人,上面写着(https://docs.oracle.com/javaee/7/api/javax/jms/JMSProducer.html):

JMSProducer的实例旨在成为轻量级对象可以自由创建并且不消耗大量资源。因此,此接口不提供关闭方法。

最新更新