Обработчик ошибок JMS весной не вызывает

У меня есть весенний 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()?

Нужно ли вызывать его вручную?

1 ответ

Вам не нужно настраивать контейнер таким образом.

Просто добавьте канал ошибок во входящий адаптер; когда происходит исключение в основном потоке (входящий_производитель_канала->), сообщение об ошибке будет отправлено в канал ошибок. Полезным грузом этого сообщения будет MessagingException, и вы можете извлечь сообщение об ошибке, чтобы попытаться отправить его в свою очередь сбоев. Просто добавьте преобразователь (выражение ="payload.failedMessage"), а затем исходящий адаптер jms. Если отправка прошла успешно, исходная транзакция будет зафиксирована. Если поток канала ошибок выдает исключение, исходное сообщение будет откатано.

Другие вопросы по тегам