我使用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);
}
}
有沒有解決這個問題的建議?