2016-03-28 102 views
0

我想關閉Spring ApplicationContext以避免「資源泄漏:」上下文「永遠不會關閉」警告。但是當我關閉它時,DefaultJMSListenerContainer也被關閉。因此我不能再收到任何消息。我的問題是我可以關閉ApplicationContext,但離開JMSListenerContainer活?如何關閉Spring ApplicationContext,但不要停止JMS Listener以避免「資源泄漏:」上下文「永遠不會關閉」?

的JMSListenerContainer是象下面這樣:

<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    <property name="destination" ref="topicDestination" /> 
    <property name="messageListener" ref="clientMessageListener" /> 
</bean> 
+0

與JMSListenerContainer配置,你可以更新的問題? – Evgeny

+0

@Evgeny我添加了JmsListenerContainer,你可以參考它並給我建議。如果我不調用AbstractApplicationContext的close方法,MessageContainer可以工作。但是如果我調用它,MessageListenerContainer也會被關閉。 – Linhoo

回答

0

由於JMSListenerContainer是應用程序上下文的一部分,因此不能關閉ApplicationContext並繼續接收消息。您的應用需要上下文才能操作。
所以,在這裏我看到兩個選項:

  1. 忽略警告「資源泄漏:用‘語境’是永遠不會關閉」或@SuppressWarnings("resource")剿它。無論如何,當jvm終止時,資源將被釋放。所以你在這裏沒有做錯什麼。
    此外,您可以添加關機鉤((AbstractApplicationContext)context).registerShutdownHook();以確保春天上下文將在jvw關閉時正常關閉。
  2. 使用下列建設創造情境

    public static void main(String[] args) throws IOException { 
        //try with resources guarantees that context will be closed 
        try(AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml")){ 
    
         //some code... 
    
         //will wait any input in console to avoid immediate context closing 
         System.in.read(); 
        } 
    } 
    
+0

非常感謝你的升溫,Evegeny。這兩個選項都可以避免警告,但是JVM運行時ApplicationContext並未實際關閉。我不知道這是否是一個真正的資源泄漏問題? – Linhoo

+0

@Linhoo當應用程序運行時,您不需要關閉ApplicationContext。這不是一般意義上的資源。 'AbstractApplicationContext'實現'Closeable',這就是Eclipse顯示資源泄漏警告的原因,但在這種情況下並不意味着泄漏是真實的。 – Evgeny

+0

配置應該是資源。你知道ApplicationContext如何處理它嗎? – Linhoo

0

能否請您創建兩個Spring的ApplicationContext的XML從一個Spring的ApplicationContext,你會收分離出DefaultJMSListenerContainer?假設爲DefaultJMSListenerContainer創建applicationContext-jms.xml,併爲其他Spring上下文配置創建applicationContext.xml。關閉applicationContext.xml以避免「資源泄漏:」上下文「永遠不會關閉」警告。

+0

這將使applicationContext-jms不關閉。我的目標是避免所有的資源主導警告,而不是關閉另一個。 – Linhoo

+0

我還有關於它的另一個問題,你可以在下面的答案:[鏈接](http://stackoverflow.com/questions/36326348/why-i-assign-the-new-classpathxmlapplicationcontextbean-xml-to-a-variable- t) – Linhoo

+0

我還有一個關於它的問題,你可以在下面回答:[爲什麼我將新的ClassPathXmlApplicationContext(「bean.xml」)分配給一個變量,資源泄漏警告消失了?](http://stackoverflow.com/問題/ 36326348/why-i-assign-the-new-classpathxmlapplicationcontextbean-xml-to-a-variable-t) – Linhoo