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);
}
}
この問題を解決するための提案はありますか?