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?
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>
Où 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?
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;
}
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);
}
}
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;
}