Question

J'ai un scénario où j'ai besoin d'arrêter le printemps de DefaultMessageListenerContainer et puis plus tard, commencer à nouveau.J'ai 10 DefaultMessageListenerContainer écoute à 10 de la file d'attente.Tous les 10 différents conteneurs font appel à la même méthode de même auditeur de message de la classe.Maintenant, je veux arrêter le messagelistenercontainer pour une file d'attente particulière en fonction de l'exception que je reçois dans la méthode onMessage.Merci de me suggérer comment je peux réaliser le scénario ci-dessus.

Voici ma configuration de port d'écoute

<bean id="msglistenerForAuditError" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsFactory"/>
        <property name="sessionTransacted" value="true"/>
        <property name="destinationName" value="test.audit.error2"/>
        <property name="messageListener" ref="auditerrorListener" />
    </bean>

    <bean id="msglistenerForAuditEvent" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="jmsFactory"/>
        <property name="sessionTransacted" value="true"/>
        <property name="destinationName" value="test.audit.event2"/>
        <property name="messageListener" ref="auditerrorListener" />
    </bean>
Était-ce utile?

La solution

L' DefaultMessageListenerContainer est un cycle de vie du haricot et comme tel, il expose un start et un stop méthode que vous pouvez utiliser pour démarrer et arrêter l'auditeur, respectivement.

Vous pouvez construire un service sur votre propre qui est le rassemblement de toutes les instances connues dans le contexte et vous pouvez alors en boucle sur ceux pour arrêter les conteneurs, quelque chose comme

@Service
public class MyService {

    private final Collection<DefaultMessageListenerContainer> containers;

    @Autowired
    public MyService(Collection<DefaultMessageListenerContainer> containers) {
        this.containers = containers;
    }

    public void stopAll() {
        // iterate over the collection and call "stop()" on each item
    }
}

Cela étant dit:

  1. Vous ne devriez pas appeler ce service dans le cadre d'un message d'écoute comme tenter d'arrêter le récipient pendant que le thread de traitement d'un message aura étrange effet secondaire
  2. L'ensemble de cas d'utilisation semble suspect pour moi.Votre message auditeurs devraient être résilient et, plus important encore, ils doivent être indépendants les uns des autres;si vous êtes à l'arrêt auditeur Un car écouteur B a déclenché une exception, quelque chose est définitivement faux dans votre conception

Autres conseils

Méthode d'arrêt sur DefaultMessagelisteneContainer n'a pas fonctionné mais la méthode d'arrêt fonctionnait parfaitement.

 for(DefaultMessageListenerContainer defaultCont:containers){
         defaultCont.shutdown();
      }

injecter une collection de défautMessagelisteneContainer n'a pas fonctionné pour moi, j'utilise le démarrage de printemps 1.4.x, avec le printemps 4.3.x

Voici comment je résolvai-je:

package org.example.queue;

import org.springframework.jms.config.JmsListenerEndpointRegistry;
//import other stuffs

@Component
public class QueueManager {


   @Autowired
   JmsListenerEndpointRegistry endpointRegistry;


    public void shutdown() {
        endpointRegistry.getListenerContainers().forEach((container) -> {
            if (container.isRunning()) {
                log.debug("Shutting down listener: " + container.getClass().getName());
                container.stop();
            }
        });
    }

    public void start() {
        endpointRegistry.getListenerContainers().forEach((container) -> {
            if (!container.isRunning()) {
                log.debug("Starting listener: " + container.getClass().getName());
                container.start();
            }
        });
    }

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top