2017-05-30 23 views
1

Spring JMS DefaultMessageListenerContainerを使用して、Springのinitメソッドでキューを初期化し、destroyメソッドでlistnereContainerを破棄しています。 しかし、ときに私がシャットダウンコマンド、私は次の例外を取得して「停止./catalina.sh」を使用してTomcatサーバーをとき、私のツールスレッドダンプ:Spring-ActiveMQ:DefaultMessageListenerContainerが破棄されない

は 『localhost-startStop-2』#155デーモンPRIO = 5 os_prio = 0 tid = 0x00007fd4c0015800 Object.wait()内のnid = 0x5265(0x00007fd4c4f60000) java.lang.Thread.State:待機中(オブジェクトモニター上) java.lang.Object.wait(ネイティブメソッド) - 待機中< 0x00000007752ccae8>(java.lang.Object上位)java.lang.Object.wait(Object.java:502)で org.springframework.jms.listener.DefaultMessageListenerContainer.doShutdown(DefaultMessageListenerContainer.java:545)で は - org.springframework.jms.listener.AbstractJmsListeningContainer.destroy(AbstractJmsListeningContainerでorg.springframework.jms.listener.AbstractJmsListeningContainer.shutdown(AbstractJmsListeningContainer.java:237) で< 0x00000007752ccae8>(java.lang.Object上位) ロック。 Javaの:com.bng.ocg.queue.QueueConnection.destroy(QueueConnection.java:71で177) ) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)ここで

では、initであり、方法を破壊します:

public void init() { 
    try { 
     connection = pooledConnectionFactory.createConnection(); 
     session = connection.createSession(false, 
       Session.DUPS_OK_ACKNOWLEDGE); 

     updateDefaultQueue(); 
     updateDefaultConsumer(); 
    } catch (JMSException e) { 
     Logger.sysLog(LogValues.error, this.getClass().getName(), coreException.GetStack(e)); 
    } catch (Exception e) { 
     Logger.sysLog(LogValues.error, this.getClass().getName(), coreException.GetStack(e)); 
    } 
} 

public void destroy(){ 
    for(DefaultMessageListenerContainer defaultMessageListenerContainer : defaultMessageListenerContainersCdrQueue) 
     defaultMessageListenerContainer.destroy(); 

    for(DefaultMessageListenerContainer defaultMessageListenerContainer : defaultMessageListenerContainersDataSyncMsgQueue) 
     defaultMessageListenerContainer.destroy(); 

    for(DefaultMessageListenerContainer defaultMessageListenerContainer : defaultMessageListenerContainersUrlHitterMsgQueue) 
     defaultMessageListenerContainer.destroy(); 
    try { 
     session.close(); 
    } catch (JMSException e) { 
     Logger.sysLog(LogValues.error, this.getClass().getName(), coreException.GetStack(e)); 
    } 
    try { 
     connection.close(); 
    } catch (JMSException e) { 
     Logger.sysLog(LogValues.error, this.getClass().getName(), coreException.GetStack(e)); 
    } 
    pooledConnectionFactory.clear(); 
} 

private void updateDefaultQueue() { 
    for (int i = 0; i < cdrQueueInitialLength; i++) { 
     cdrQueueList.add(cdrQueueNamePrefixString + i); 
    } 

    for (int i = 0; i < dataSyncMsgQueueInitialLength; i++) { 
     dataSyncMsgQueueList.add(dataSyncMsgQueueNamePrefixString + i); 
    } 

    for (int i = 0; i < urlHitterMsgQueueInitialLength; i++) { 
     urlHitterMsgQueueList.add(urlHitterMsgQueueNamePrefixString + i); 
    } 
} 

private void updateDefaultConsumer() throws JMSException 
{ 
    /*for (int i = 0; i < cdrQueueInitialLength; i++) { 
     defaultMessageListenerContainer = defaultMessageListenerContainerFactory 
       .getObject(); 
     defaultMessageListenerContainer.setDestination(session 
       .createQueue(cdrQueueList.get(i))); 
     defaultMessageListenerContainer 
       .setMessageListener(cdrMessageListener); 
     defaultMessageListenerContainer.start(); 
     defaultMessageListenerContainersCdrQueue 
       .add(defaultMessageListenerContainer); 
    }*/ 

    for (int i = 0; i < dataSyncMsgQueueInitialLength; i++) { 
     defaultMessageListenerContainer = defaultMessageListenerContainerDataSyncFactory 
       .getObject(); 
     defaultMessageListenerContainer.setDestination(session 
       .createQueue(dataSyncMsgQueueList.get(i))); 
     defaultMessageListenerContainer 
       .setMessageListener(dataSyncMsgListener); 
     defaultMessageListenerContainer.start(); 
     defaultMessageListenerContainersDataSyncMsgQueue 
       .add(defaultMessageListenerContainer); 
    } 

    for (int i = 0; i < urlHitterMsgQueueInitialLength; i++) { 
     defaultMessageListenerContainer = defaultMessageListenerContainerUrlHitterFactory 
       .getObject(); 
     defaultMessageListenerContainer.setDestination(session 
       .createQueue(urlHitterMsgQueueList.get(i))); 
     defaultMessageListenerContainer 
       .setMessageListener(urlHitterMsgListener); 
     defaultMessageListenerContainer.start(); 
     defaultMessageListenerContainersUrlHitterMsgQueue 
       .add(defaultMessageListenerContainer); 
    } 
} 

この問題を解決するための提案はありますか?

答えて

0

私はあなたのdestroy()が呼ばれていないと思いますか?

あなたdestroy()方法に@PreDestroyを追加したり、春@EventListenerを使用する必要がありますかApplicationListener

@EventListener({ ContextClosedEvent.class }) 
public void destroy() { 

} 


@Component 
public class ContextClosed implements ApplicationListener<ContextClosedEvent> { 

    @Override 
    public void onApplicationEvent(final ContextClosedEvent event) { 
     destroy(); // your destroy 
    } 
} 
を実装
関連する問題