【问题标题】:MessageHandlingException message in error channel错误通道中的 MessageHandlingException 消息
【发布时间】:2018-09-01 09:38:19
【问题描述】:

我编写了一个异常处理程序类,它查看默认 Spring Integration 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;
    }

我知道当handleTradeError() 中的类型为Message&lt;MessageHandlingException&gt; message 时,我可以得到org.springframework.messaging.MessageHandlingException: nested exception is java.lang.ClassCastException

我该如何改进这种方法,以便也处理此类错误,或者也从这种类型中提取底层tradeprocessingContext

【问题讨论】:

    标签: java spring spring-integration enterprise-integration


    【解决方案1】:

    错误通道获得一个带有 Throwable 有效负载的 ErrorMessage。通常 Throwable 是消息处理异常,原始消息在 failedMessage 属性中,异常在原因中。

    【讨论】:

    • 所以类型可以从TPC变成MessageHandlingException?我可以在所有情况下提取 TPC 有效负载吗?我可以在 process() 上将返回类型更改为 void 吗?
    • 是的,是的,只要上游没有网关等待回复。如果您只想要原始消息并且不关心原因,您还可以在上游添加转换器以提取 failedMessage。
    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多