2016-07-22 179 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 )。 –