Выполнение прослушивателя сообщений JMS не выполнено, и не установлен параметр ErrorHandler
Когда я использую Spring для прослушивания JMS-сообщений, я получаю вышеуказанную ошибку.
Мне интересно, как добавить обработчик ошибок в JMS-прослушиватель?
Ответы
Ответ 1
В 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
является bean, реализующим ErrorHandler
:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
Однако обратите внимание, что согласно документации:
Поведение этого прослушивателя сообщений по умолчанию [...] будет регистрировать любое такое исключение на уровне ошибки. [...] Однако, если обработка ошибок необходима, любая реализация стратегии ErrorHandler может быть предоставлена методу setErrorHandler (ErrorHandler).
Проверьте свои журналы, возможно, что уже зарегистрировано исключение?
Ответ 2
Без конфигурации xml. В 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);
}
}
Ответ 3
В случае использования по умолчанию factory:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
SomeHandler errorHandler) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}
Ответ 4
Мне нравится короткое и сладкое!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}