Quando utilizzo Spring per ascoltare i messaggi JMS, ricevo l'errore sopra riportato.L'esecuzione del listener di messaggi JMS non è riuscita e nessun ErrorHandler è stato impostato
Mi chiedo come aggiungere un Errorhandler nel listener JMS?
Quando utilizzo Spring per ascoltare i messaggi JMS, ricevo l'errore sopra riportato.L'esecuzione del listener di messaggi JMS non è riuscita e nessun ErrorHandler è stato impostato
Mi chiedo come aggiungere un Errorhandler nel listener JMS?
C'è una proprietà in 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>
Dove someHandler
è un fagiolo attuazione ErrorHandler
:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
Tuttavia notare che secondo la documentation:
Il comportamento predefinito di questo listener di messaggi [...] sarà registra tali eccezioni al livello di errore. [...] Tuttavia, se è necessaria la gestione degli errori, qualsiasi implementazione della strategia ErrorHandler può essere fornita al metodo setErrorHandler (ErrorHandler).
Controllare i log, forse l'eccezione è già registrata?
Senza la configurazione xml. Ho fatto quanto segue in 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);
}
}
Nel caso in cui utilizzata di fabbrica:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
SomeHandler errorHandler) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}
mi piace breve e dolce!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}
grazie per la risposta. A proposito, perché usare @Service per questo bean? – user705414
Sembra che l'eccezione venga registrata utilizzando il livello WARN per impostazione predefinita. – user705414
@ user705414: questo sembra essere un errore nella documentazione: ['AbstractMessageListenerContainer.invokeErrorHandler()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-jms/ 3.0.6.RELEASE/org/springframework/jms/listener/AbstractMessageListenerContainer.java # AbstractMessageListenerContainer.invokeErrorHandler (java.lang.Throwable)) utilizza infatti 'log.warn()'. Io uso @Service per rilevare automaticamente il bean, ovviamente ogni modo per dichiarare che il bean del gestore degli errori è corretto. –