MessageHandlingException сообщение в канале ошибки

Я написал класс обработчика исключений, который смотрит на стандартную интеграцию Spring errorChannel для входящих сообщений типа Message<TradeProcessingContext> message:

@Slf4j
public class ExceptionHandler {

    @Autowired
    private ExceptionDAO exceptionDAO;


    @ServiceActivator(inputChannel = DEFAULT_ERROR_CHANNEL)
    public void handleTradeError(Message<TradeProcessingContext> message) {

        TradeProcessingContext tradeProcessingContext = message.getPayload();

        if (tradeProcessingContext != null) {
          //store in database
        }
    }

}

У меня есть реализации обработчика следующим образом:

@Slf4j
@MessageEndpoint
public class ChildHandler extends ParentHandler {

    @Autowired
    private SomeDAO someDAO;

    @ServiceActivator(inputChannel = INPUT_CHANNEL, outputChannel = DEFAULT_ERROR_CHANNEL)
    public Message<TradeProcessingContext> handle(final Event event) {
        return process(event);
    }

    @Override
    protected TradeDAO getDAO() {
        return someDAO;
    }
}

Это вызывает родителя process()

public abstract class ParentHandler implements Handler {

    @Resource
    private SomeService service;


    public Message<TradeProcessingContext> process(final Event event) {

        TradeProcessingContext tradeProcessingContext = new TradeProcessingContext();

        //set initial context

        try {
            List<Trade> trades = getDAO().findByEventId(event.getEventId());
            for (Trade trade : trades) {
                tradeProcessingContext.setRef(trade.getRef());
                Future<TradeProcessingContext> thread = service.doSomething(trade, tradeProcessingContext);
                tradeProcessingContext = thread.get();
            }
        } catch (Exception e) {
            return MessageBuilder.withPayload(tradeProcessingContext).build();
        }

        return null;
    }

Я понимаю, что могу получить org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException когда тип Message<MessageHandlingException> message в handleTradeError(),

Как я могу улучшить этот метод так, чтобы о таких ошибках заботились также или основной tradeprocessingContext тоже извлекается из этого типа?

1 ответ

Решение

Канал ошибок получает сообщение ErrorMessage с полезной нагрузкой Throwable. Обычно Throwable - это исключение обработки сообщений с исходным сообщением в свойстве failedMessage и исключением в причине.

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