JMS消息侦听器的执行失败,并且未设置ErrorHandler

use*_*414 23 java spring jms spring-jms

当我使用Spring收听JMS消息时,我收到了上述错误.

我想知道如何将Errorhandler添加到JMS侦听器中?

Tom*_*icz 19

有一个属性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>
Run Code Online (Sandbox Code Playgroud)

someHandlerbean 在哪里实现ErrorHandler:

@Service
public class SomeHandler implements ErrorHandler {

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

但请注意,根据文档:

此消息侦听器的默认行为[...]将在错误级别记录任何此类异常.[...]但是,如果需要进行错误处理,则可以向setErrorHandler(ErrorHandler)方法提供ErrorHandler策略的任何实现.

查看您的日志,可能已经记录了异常?

  • @ user705414:这似乎是文档中的错误:[`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))确实使用`log.warn()`。我使用@Service自动检测bean,当然可以使用任何方法声明错误处理程序bean都可以。 (2认同)

Kuc*_*chi 5

没有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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Buc*_*oka 5

我喜欢它又短又甜!

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