29

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

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

4

5 回答 5

22

上有一个属性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>

bean在哪里someHandler实现ErrorHandler

@Service
public class SomeHandler implements ErrorHandler {

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

但是请注意,根据文档

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

查看您的日志,也许已经记录了异常?

于 2012-01-19T07:50:56.490 回答
6

我喜欢它又短又甜!

    @Bean
JmsListenerContainerFactory<?> jmsContainerFactory(ConnectionFactory connectionFactory) {
    SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setErrorHandler(t -> {
         log.error("Error in listener!", t);
       });
    return factory;
}
于 2017-11-30T08:35:29.727 回答
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);
    }
}
于 2016-04-08T13:09:37.397 回答
1

如果使用默认工厂:

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory,
            SomeHandler errorHandler) {
        DefaultJmsListenerContainerFactory factory =
                new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
于 2016-12-08T11:18:23.200 回答
0

我检查了答案,但没有人告诉我们这个错误处理程序是什么以及为什么我们需要设置这个错误处理程序?JMSException 不需要此 errorHandler。JMSException 需要被 exceptionListener 监听,如下所示

DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setExceptionListener(new ExceptionListener() {
            @Override
            public void onException(JMSException exception) {
                System.out.println("JMSException is occurred " + exception);
                //TODO the way you need to handle the exception
            }
        });

此 ErrorHandler 用于在处理消息时抛出任何未捕获的异常时调用。

默认情况下,不会有 ErrorHandler,因此错误级别的日志记录是唯一的结果。

 DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setErrorHandler(new ErrorHandler() {
            @Override
            public void handleError(Throwable t) {
                System.out.println("Unknown Exception is occurred " + t);
            }
        });

这是最好的方法吗?

设置errorHandler是一种处理消息处理过程中发生的未知异常的方法。但是当我们看这个场景时,我们错过了 JMS 的实际消息。对于故障排除,消息将起到至关重要的作用。所以我的方法如下在 JMSListener 方法中

 @JmsListener(destination = "${ibm.mq.queue.response.edmonton}", containerFactory = "mqContainerFactory", concurrency = "${ibm.mq.concurrency}")
    public void receiveMessage(Message message) {
     try{
        //MessageProcessingCode
     }catch(Exception ex){
       //Define a custom ErrorHandler which can take exception and message
       CustomErrorHandler eh = new CustomErrorHandler();
       eh.handleError(ex,message);
     }
    }

请注意,我们不会捕获 throwable,因为 Throwable 是 Java 中所有错误和异常的超类。错误是所有错误的超类,这些错误并不意味着被应用程序捕获。捕获 Throwable 或 Error 也会捕获 OutOfMemoryError 和 InternalError,应用程序不应尝试从中恢复。

于 2021-10-22T16:17:42.973 回答