2017-05-30 3 views
1

Je travaille avec Spring JMS DefaultMessageListenerContainer et initialise les files d'attente sur la méthode init du ressort et détruit la méthode listnereContainer on destroy. Mais quand je arrêter le serveur tomcat en utilisant "./catalina.sh stop" commande, j'obtenir l'exception suivante quand je outil le vidage de fil:Spring-ActiveMQ: DefaultMessageListenerContainer n'est pas détruit

"localhost-StartStop-2" # 155 démon prio = 5 os_prio = 0 tid = 0x00007fd4c0015800 nid = 0x5265 dans Object.wait() [0x00007fd4c4f60000] java.lang.Thread.State: WAITING (sur le moniteur d'objet) at java.lang.Object.wait (méthode native) - en attente sur < 0x00000007752ccae8> (a java.lang.Object) à java.lang.Object.wait (Object.java:502) à org.springframework.jms.listener.DefaultMessageListenerContainer.doShutdown (DefaultMessageListenerContainer.java:545) - verrouillé < 0x00000007752ccae8> (a 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 (native Method)

Voici init et détruire les méthodes :

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); 
    } 
} 

Une suggestion pour résoudre ce problème?

Répondre

0

Je pense que votre destroy() n'est pas appelé ??

vous devez ajouter à votre méthode @PreDestroydestroy() ou utiliser le printemps @EventListener ou instruments ApplicationListener

@EventListener({ ContextClosedEvent.class }) 
public void destroy() { 

} 


@Component 
public class ContextClosed implements ApplicationListener<ContextClosedEvent> { 

    @Override 
    public void onApplicationEvent(final ContextClosedEvent event) { 
     destroy(); // your destroy 
    } 
}