2017-05-30 124 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 
    } 
}