spring JMS 错误处理程序未调用

标签 spring jakarta-ee error-handling spring-integration spring-jms

我有如下 Spring JMS 消息监听器容器设置。

    <beans:bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">     
            <beans:property name="connectionFactory" ref="amqConnectionFactory" />
            <beans:property name="destination" ref="request.Queue" />
            <beans:property name="messageListener" ref="messageListener" /> 
            <beans:property name="sessionTransacted" value="true" />        
            <beans:property name="errorHandler" ref="inboundErrorHandler"/>              
        </beans:bean>

<beans:bean id="inboundErrorHandler" class="com.test.exception.MDPErrorHandler" /> 

监听器代码如下..
@Component
public class MyMessageListener implements MessageListener {

    private static final Log LOG = LogFactory.getLogger(MyMessageListener.class);

    @Autowired
    private MessageHandler handler;

    /**
     * @see MessageListener#onMessage(Message)
     */
    @Override   
    public void onMessage(Message inMessage) {  

         try
            {   
                if (inMessage instanceof TextMessage) {
                    TextMessage msg = (TextMessage) inMessage;                      
                    handler.processRequest(msg.getText());                                                 
                } else {
                    LOG.error("Message of wrong type: " + inMessage.getClass().getName());
                }

           } catch (Exception cause) {
              LOG.error("Error while receiving message in MlaMessageListener.onMesage() ",cause);
           }
    }   

}

我的错误处理程序如下..
public class MDPErrorHandler implements ErrorHandler {
    /** 
     * @see org.springframework.util.ErrorHandler#handleError(java.lang.Throwable)
     */
    @Override
    public void handleError(Throwable t) {
        LOG.warn("Inside MDPErrorHandler.handleError()*** ");
        t.printStackTrace();
    }
}

如果 messageListener.onMessage() 中发生任何异常/错误,为什么我的错误处理程序不会自动调用?

我需要手动调用它吗?

最佳答案

您不需要像那样配置容器。

只需向入站适配器添加一个错误 channel ;当主流程(incomingUpdateChannel->)发生异常时,错误消息将被发送到错误 channel 。该消息的有效负载将是一个 MessagingException,您可以提取失败的消息以尝试发送到您的失败队列。只需添加一个转换器 (expresssion="payload.failedMessage"),然后是一个 jms 出站适配器。如果发送成功,则原始事务将提交。如果错误 channel 流抛出异常,原始消息将被回滚。

关于spring JMS 错误处理程序未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38772933/

相关文章:

java - spring默认@Transactional和默认丢失更新

java - 删除方法在 Spring Boot&Thymeleaf 中不起作用

spring - 在 spring mvc 中使用 @component 注解注释的 Spring 类的范围是什么?

java - 全局事务管理-Jboss : Closing a connection for you

jakarta-ee - 在 WildFly 上使用本地接口(interface)查找 EJB

重复关键字参数的 Python SyntaxError 与 TypeError

java - 如何在 Java 中使用 SOAP Web 服务

java - 如何检查消息发送到 JMS 队列是否成功?

C# 类型 _ 没有定义构造函数

php - PHP中的http_response_code()