2017-05-30 123 views
1

我使用Spring JMS DefaultMessageListenerContainer,並初始化spring的init方法上的隊列,並銷燬destroy方法上的listnereContainer。 但是當我關閉使用「./catalina.sh停止」命令,我收到以下異常Tomcat服務器時,我的工具線程轉儲:Spring-ActiveMQ:DefaultMessageListenerContainer沒有被破壞

‘本地主機-startStop-2’#155守護PRIO = 5 Object.wait()[0x00007fd4c4f60000] java.lang.Thread.State:WAITING(在對象監視器上) at java.lang.Object.wait(Native Method) - 等待< 0x00000007752ccae8>(一個java.lang.Object中) 在java.lang.Object.wait(Object.java:502) 在org.springframework.jms.listener.DefaultMessageListenerContainer.doShutdown(DefaultMessageListenerContainer.java:545) - 鎖定< 0x00000007752ccae8>(一個java.lang.Object中) 在org.springframework.jms.listener.AbstractJmsListeningContainer.shutdown(AbstractJmsListeningContainer.java:237) 在org.springframework.jms.listener.AbstractJmsListeningContainer.destroy(AbstractJmsListeningContainer。 Java的:177) 在com.bng.ocg.queue.QueueConnection.destroy(QueueConnection.java:71) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)

這裏是init和destroy方法:

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()不叫???

必須添加@PreDestroy到您的destroy()方法或採用彈簧@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 
    } 
}