当我使用Spring收听JMS消息时,我收到了上述错误。
我想知道如何将Errorhandler添加到JMS侦听器中?
答案 0 :(得分:18)
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
是实现ErrorHandler
的bean:
@Service
public class SomeHandler implements ErrorHandler {
@Override
public void handleError(Throwable t) {
log.error("Error in listener", t);
}
}
但请注意,根据documentation:
此消息侦听器的默认行为[...]将在错误级别记录任何此类异常。 [...]但是,如果需要进行错误处理,则可以向setErrorHandler(ErrorHandler)方法提供ErrorHandler策略的任何实现。
查看您的日志,可能已经记录了异常?
答案 1 :(得分:3)
没有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);
}
}
答案 2 :(得分:2)
我喜欢它简短而甜蜜!
@Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(t -> {
log.error("Error in listener!", t);
});
return factory;
}
答案 3 :(得分:0)
如果使用默认工厂:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
SomeHandler errorHandler) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setErrorHandler(errorHandler);
return factory;
}