Comportement étrange possible dans la classe de configuration JMS

Bois de construction

Ceci est une question distincte mais liée à mon article précédent ici: Terminer en toute sécurité une application Spring JMS

Mon application JMS que j'utilise avec Spring Boot traite tout correctement et s'arrête sans erreur. Pour que cela fonctionne, j'ai changé un bean de:

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(mqConnectionFactory());
    factory.setDestinationResolver(destinationResolver());
    factory.setConcurrency("1");
    factory.setErrorHandler(errorHandler());
    factory.setSessionTransacted(true);
    factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
    return factory;
}

À:

@Bean
    public DefaultMessageListenerContainer defaultMessageListenerContainer() {
        DefaultMessageListenerContainer jmsListenerContainer = new DefaultMessageListenerContainer();
        jmsListenerContainer.setConnectionFactory(mqConnectionFactory());
        jmsListenerContainer.setDestinationResolver(destinationResolver());
        jmsListenerContainer.setDestinationName(queueName);
        jmsListenerContainer.setConcurrency("1");
        jmsListenerContainer.setErrorHandler(errorHandler());
        jmsListenerContainer.setSessionTransacted(true);
        jmsListenerContainer.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        jmsListenerContainer.setAutoStartup(false);
        return jmsListenerContainer;
    }

Le problème avec ceci est que j'aurais pu créer juste un "hotfix", car mes connaissances sur le printemps sont limitées. la ligne dans le bean modifié a jmsListenerContainer.setAutoStartup(false);été ajoutée lorsque je suis tombé sur ce post: http://forum.spring.io/forum/spring-projects/integration/79176-illegalstateexception-no-message-listener-specified comme sans le autoStartupset à false Je reçois ceci après chaque message traité dans mes journaux:

java.lang.IllegalStateException: No message listener specified - see property 'messageListener'
    at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:691) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:651) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:315) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:253) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1150) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1142) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1039) [spring-jms-4.2.4.RELEASE.jar:4.2.4.RELEASE]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_74]

Tout est toujours traité et arrêté correctement, je le vois simplement dans mes journaux. Je ne sais pas s'il y a un conflit dans mon fichier de configuration ou non qui peut en être la racine. Je veux juste m'assurer que les modifications ne causeront pas de problèmes, même si tout fonctionne actuellement comme prévu sans erreur.

Enfin, voici toute ma classe de configuration:

@Configuration
@EnableJms
public class MQConfig {

    private static final Logger logger = LogManager.getLogger(MQConfig.class.getName());

    @Value("${mq.hostName}")
    String host;
    @Value("${mq.port}")
    Integer port;
    @Value("${mq.queueManager}")
    String queueManager;
    @Value("${mq.queueName}")
    String queueName;
    @Value("${mq.channel}")
    String channel;

    @Autowired
    Environment environment;

    @Bean
    public DefaultMessageListenerContainer defaultMessageListenerContainer() {
        DefaultMessageListenerContainer jmsListenerContainer = new DefaultMessageListenerContainer();
        jmsListenerContainer.setConnectionFactory(mqConnectionFactory());
        jmsListenerContainer.setDestinationResolver(destinationResolver());
        jmsListenerContainer.setDestinationName(queueName);
        jmsListenerContainer.setConcurrency("1");
        jmsListenerContainer.setErrorHandler(errorHandler());
        jmsListenerContainer.setSessionTransacted(true);
        jmsListenerContainer.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        jmsListenerContainer.setAutoStartup(false);
        return jmsListenerContainer;
    }

    @Bean
    public MQConnectionFactory mqConnectionFactory() {
        MQConnectionFactory mqConnectionFactory = new MQConnectionFactory();

        try {
            mqConnectionFactory.setHostName(host);
            mqConnectionFactory.setPort(port);
            mqConnectionFactory.setQueueManager(queueManager);
            mqConnectionFactory.setTransportType(1);
        } catch (JMSException ex) {
            logger.error(ex.getStackTrace());
        }

        return mqConnectionFactory;
    }

    @Bean
    public DynamicDestinationResolver destinationResolver() {
        DynamicDestinationResolver destinationResolver = new DynamicDestinationResolver();

        try {
            Connection connection = mqConnectionFactory().createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            destinationResolver.resolveDestinationName(session, queueName, false);
        } catch (JMSException ex) {
            logger.error(ex.getStackTrace());
        }

        return destinationResolver;
    }

    @Bean
    public MQQueue mqQueue() {
        MQQueue mqQueue = new MQQueue();

        try {
            mqQueue.setBaseQueueName(queueName);
            mqQueue.setBaseQueueManagerName(queueManager);
        } catch (JMSException ex) {
            logger.error(ex.getStackTrace());
        }

        return mqQueue;
    }

    @Bean
    public JmsErrorHandler errorHandler(){
        return new JmsErrorHandler();
    }

    @Bean
    public MQManager mqHoldManager(){
        return new MQManager(host, port, queueName,
                queueManager, channel);
    }

    @Bean
    public MQInitializer mqInitializer(){
        return new MQInitializer(environment);
    }


}

Pensées? Est-ce compliqué?

EDIT: Écouteur JMS

@Component
public class MQConsumer {

    @Resource(name = "mqHoldManager")
    private MQManager mqHoldManager;
    @Resource(name = "defaultMessageListenerContainer")
    private DefaultMessageListenerContainer listenerContainer;

    @Autowired
    MQInitializer mqInitializer;    /* To ensure this bean executes before Listener Setup not necessarily for any particular usage*/

    final Logger logger = LogManager.getLogger(MQConsumer.class.getName());
    private static ReportManager reportManager = new ReportManager();
    private static boolean isFirstQueue = true;

    @JmsListener(destination = "${mq.queueName}")
    public void processOrder(String message) throws Exception {...}
Gary Russell

Je suis confus.

DefaultJmsListenerContainerFactory est à utiliser avec les méthodes POJO annotées:

@JmsListener(...)
public void foo(String bar) {...}

La fabrique est utilisée pour créer le conteneur d'écouteur de la méthode.

Avec votre configuration de remplacement, je ne vous vois jamais configurer un écouteur de message dans le DefaultMessageListenerContainer.

Habituellement, vous auriez container.setMessageListner(myListener)myListenerest un MessageListener, un SessionAwareMessageListenerou un MessageListenerAdapterqui enveloppe un auditeur POJO.

Définir autoStartupsur false et ne jamais démarrer le conteneur ne fait rien sauf ajouter le bean conteneur au contexte.

Je ne vois pas comment vous pouvez jamais obtenir des messages avec cette configuration.

ÉDITER

Utilisez-vous Spring Boot? Si tel est le cas, cela créera une valeur jmsListenerContainerFactorypar défaut pour vous - c'est ma meilleure estimation.

Dans ce cas, votre code d'arrêt n'arrête pas vraiment le conteneur réel - juste le "factice" qui n'a jamais été démarré.

Je vous suggère de donner votre @JmsListeneran id, @Autowirele JmsListenerEndpointRegistryet appeler registry.getListenerContainer("myListener").stop().

@JmsListener(id = "myListener", destination = "${mq.queueName}")

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comportement étrange de la classe récursive dans la boucle for

Comportement étrange dans la recherche de chemin A *

Comportement étrange dans la destruction de struct

Comportement étrange lors de la création d'attributs python dans la classe cdef cython

Comportement étrange de la classe de ligne dans le bootstrap 3

Comportement étrange de constexpr pour la classe interne

Comportement étrange de StampedLock avec la classe Thread

Comportement étrange de la classe C ++ en Python avec SWIG

Comportement étrange de (^) dans Haskell

Comportement étrange de la requête de plage dans Elasticsearch

Comportement étrange de la fonction de réorganisation dans R

Comportement étrange de la boucle

Comportement étrange de next() dans la chaîne réactive

Comportement étrange de la fonction « interposer » dans Clojure

Comportement étrange dans la concaténation de liste Python

Comportement étrange lors de la programmation C dans eclipse

golang a un comportement étrange dans la détection de blocage

Comportement étrange dans la comparaison de chaînes C ++

Comportement étrange de Javascript dans la manipulation d'objets Json

Comportement étrange de la mise à jour dans R shiny

comportement étrange de la fonction do () dans dplyr

Comportement étrange de la régression linéaire dans PyTorch

Comportement étrange avec la fonction de comptage dans MySQL 5.6

Comportement étrange de la requête dans les pandas

comportement étrange de la commande "jobs" dans les scripts bash

Comportement étrange de Python dans la file d'attente

Comportement étrange de .Contains dans la gestion des API Azure

Comportement étrange avec la classe active PHP

La comparaison de la classe wrapper avec la primitive en utilisant equals () donne un comportement étrange

TOP liste

  1. 1

    J'ai besoin de savoir si ces deux phrases sont les mêmes en programmation

  2. 2

    Javascript indiquant "impossible de définir la propriété 'innerHTML' sur null"

  3. 3

    Nextcloud avec Docker: impossible de créer ou d'écrire dans le répertoire de données

  4. 4

    La taille de la forme n'est pas égale à la taille de la cellule du tableau et ajuste le texte à l'intérieur de la forme

  5. 5

    Trouver l'intersection et l'union de deux rectangles

  6. 6

    Comment changer la couleur de la police dans R?

  7. 7

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  8. 8

    Référencement des assemblys de structure .net 4.7 dans la solution .net core 2

  9. 9

    Compter combien de fois un nombre apparaît dans un tableau aléatoire

  10. 10

    Pourquoi utiliser Asyncio ne réduit pas le temps d'exécution global en Python et n'exécute pas les fonctions simultanément?

  11. 11

    Comment convertir une chaîne en tuple en utilisant `reads`?

  12. 12

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

  13. 13

    comment afficher un bouton au-dessus d'un autre élément ?

  14. 14

    Création d'un nouvel objet d'une classe avec un nouveau nom en cliquant sur un bouton dans java swing

  15. 15

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  16. 16

    Restauration de la sauvegarde de la base de données SQL Server sur la version inférieure

  17. 17

    Créer un graphique à barres avec une fréquence relative / à partir d'un objet de table dans R

  18. 18

    Création d'un rappel python pour une fonction C à partir d'une DLL avec un tampon char.

  19. 19

    java.lang.NoClassDefFoundError: org / springframework / data / repository / config / BootstrapMode

  20. 20

    comment le contrôle de tableau javascript devrait-il être

  21. 21

    impossible d'ouvrir un nouvel onglet dans react, ajoute localhost: 3000 sur le lien?

chaudétiquette

Archive