为什么使用控制总线发送消息时,Spring Integration 的 errorChannel 中没有捕获异常

why exceptions are not catched in the errorChannel of spring integration when the messages are sent using the control bus

提问人:becem wniss 提问时间:5/27/2019 更新时间:5/29/2019 访问量:52

问:

我在数据库中存储了一条 spring 集成消息。此消息在发生异常后存储,并由 errorChannel 捕获。

现在,当我尝试使用控制总线重播此消息时,如果发生异常,我会在日志中看到错误,但 errorChannel 没有捕获到异常。

这是我使用的代码:

    @Qualifier("control-bus.replay.channel")
    MessageChannel controlBus;

    public void redo(Message<?> msg){
      controlBus.send(
      MessageBuilder.withPayload(
      "@mybean.transform(headers['myMessage'])") 
      .setHeader("myMessage", msg).build());
   }

我试图在消息的标题中添加errorChannel,但没有奏效。

所以我想知道这是否是控制总线的默认行为以及如何覆盖它。

弹簧集成

评论


答:

0赞 Artem Bilan 5/29/2019 #1

与控制总线本身无关。这是由用于发送该消息的类型决定的行为。MessageChannel

默认情况下,a 用于连接端点。当您将消息直接发送到该通道时(如在代码片段中所做的那样),异常将直接引发给此调用方,忽略所有可能的错误处理配置。想象一下,您在没有任何线程转移的情况下执行常规 Java 调用堆栈。所以,例外只是抛给你。 当然,如果该通道上的整个流程是直接的,则效果很好:中间没有任何队列或执行器通道配置。DirectChannel

从这里可以看到您的和控制总线配置会很棒。control-bus.replay.channel