2016-07-22 182 views
0

,我经常收到以下警告:发送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); 
    } 
} 

任何想法?我在Google上找不到任何东西。

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

回答

0

我认为这个信息清楚地解释了这个问题。可能你只需要调用close()或者你创建的制作者。

编辑:

其实,它不是生产需要关闭,但背景。

从DOC(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的实例意在其 可以自由创建,并且不会消耗显著资源轻量级的对象。 因此此接口不提供关闭方法。

+0

嗨,我添加了一个调用来关闭,现在他告诉我,“不允许调用此方法注入JMSContext(请参阅JMS 2.0规范,º12.4.5)。” –

+0

在上面提到的javadoc到JMSContext中,它说_Applications运行在Java EE web和EJB容器中,或者可以使用@Inject注释将JMSContext注入到它们的应用程序中。以这种方式创建的JMSContext被描述为容器管理。容器管理的JMSContext将由容器自动关闭。所以不,我不需要关注上下文。 –

+0

噢,作为更新:如果您尝试关闭注入的JMSContext,则会得到以下异常:javax.jms.IllegalStateRuntimeException:WFLYMSGAMQ0068:不允许在注入的JMSContext上调用此方法(请参阅JMS 2.0规范,º12.4.5 )。 –