web-dev-qa-db-fra.com

L'exécution du programme d'écoute de messages JMS a échoué et aucun gestionnaire d'erreur n'a été défini.

Lorsque j'utilise Spring pour écouter les messages JMS, j'ai reçu l'erreur ci-dessus. 

Je me demande comment ajouter un gestionnaire d'erreur dans le programme d'écoute JMS?

21
user705414

Il y a une propriété sur AbstractMessageListenerContainer :

<bean id="listener" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="errorHandler" ref="someHandler"/>
    <property name="destinationName" value="someQueue"/>
    <property name="connectionFactory" ref="connectionFactory"/>
</bean>

someHandler est un bean implémentant ErrorHandler :

@Service
public class SomeHandler implements ErrorHandler {

    @Override
    public void handleError(Throwable t) {
        log.error("Error in listener", t);
    }
}

Notez toutefois que selon la documentation :

Le comportement par défaut de cet écouteur de messages [...] sera enregistre une telle exception au niveau de l'erreur. [...] Cependant, si le traitement des erreurs est nécessaire, toute implémentation de la stratégie ErrorHandler peut être fournie à la méthode setErrorHandler (ErrorHandler).

Consultez vos journaux, peut-être que l'exception est déjà enregistrée?

18
Tomasz Nurkiewicz

J'aime ça court et doux!

    @Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setErrorHandler(t -> {
         log.error("Error in listener!", t);
       });
    return factory;
}
2
BuckBazooka

Sans la configuration XML. J'ai fait ce qui suit dans ApplicationContext.

@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory,
        SomeHandler errorHandler) {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setErrorHandler(errorHandler);
    return factory;
}


// From Tomasz answer
@Service
public class SomeHandler implements ErrorHandler {

    @Override
    public void handleError(Throwable t) {
        log.error("Error in listener", t);
    }
}
2
Kuchi

En cas d'utilisation par défaut de l'usine:

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
            SomeHandler errorHandler) {
        DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
0
Tsolak Barseghyan