首页 文章

Spring-ActiveMQ:DefaultMessageListenerContainer没有被破坏

提问于
浏览
1

我使用Spring JMS DefaultMessageListenerContainer并在spring的init方法上初始化队列并在destroy方法上销毁listnereContainer . 但是当我使用“./catalina.sh stop”命令关闭tomcat服务器时,我在使用线程转储时遇到以下异常:

“localhost-startStop-2”#155 daemon prio = 5 os_prio = 0 tid = 0x00007fd4c0015800 nid = 0x5265 in Object.wait()[0x00007fd4c4f60000] java.lang.Thread.State:在java.lang上的WAITING(在对象监视器上) .Object.wait(Native Method) - 在org.springframework.jms.listener.DefaultMessageListenerContainer.doShutdown上的java.lang.Object.wait(Object.java:502)上等待<0x00000007752ccae8>(java.lang.Object) DefaultMessageListenerContainer.java:545) - 在org.springframework.jms.listener.AbstractJmsListeningContainer.destroy的org.springframework.jms.listener.AbstractJmsListeningContainer.shutdown(AbstractJmsListeningContainer.java:237)上锁定<0x00000007752ccae8>(java.lang.Object) (AbstractJmsListeningContainer.java:177)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)中的com.bng.ocg.queue.QueueConnection.destroy(QueueConnection.java:71)

以下是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);
    }
}

有什么建议可以解决这个问题吗?

1 回答

  • 0

    我认为你的 destroy() 没有叫?

    你必须将 @PreDestroy 添加到 destroy() 方法或使用spring @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
        }
    }
    

相关问题