【问题标题】:Handling errors after a message splitter with direct channels使用直接通道处理消息拆分器后的错误
【发布时间】:2017-10-03 13:53:06
【问题描述】:

我正在开发一项使用 spring 集成 java dsl 发送电子邮件的服务。

我有一个批处理消息,它被拆分为一组单独的消息,这些消息将被转换为电子邮件。

我遇到的问题是,如果其中一条消息引发错误,则不会处理批处理中的其他消息。

有没有办法配置流程,以便在消息引发异常时,优雅地处理异常并处理批处理中的下一条消息?

以下代码实现了我想要的功能,但我想知道是否有更简单/更好的方法来实现这一点,理想情况下是在单个 IntegrationFlow 中? :

    @Bean
    public MessageChannel individualFlowInputChannel() {
        return MessageChannels.direct().get();
    }

    @Bean
    public IntegrationFlow batchFlow() {
        return f -> f
            .split()
            .handle(message -> {
                try {
                    individualFlowInputChannel().send(message);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    }

    @Bean
    public IntegrationFlow individualFlow() {
        return IntegrationFlows.from(individualFlowInputChannel())
            .handle((payload, headers) -> {
                throw new RuntimeException("BOOM!");
            }).get();
    }

【问题讨论】:

    标签: spring-integration spring-integration-dsl


    【解决方案1】:

    您可以使用trapException 选项将ExpressionEvaluatingRequestHandlerAdvice 添加到最后一个handle() 定义中:

    /**
     * If true, any exception will be caught and null returned.
     * Default false.
     * @param trapException true to trap Exceptions.
     */
    public void setTrapException(boolean trapException) {
    

    另一方面,如果您正在谈论“发送电子邮件”,那么考虑在每个拆分项目的单独线程中执行此操作不是更好吗?在这种情况下,.split() 之后的 ExecutorChannel 就派上用场了!

    【讨论】:

    • 谢谢阿特姆。该建议仅适用于handle() 定义,对吗?我也想对来自任何下游组件的异常保持稳健。我同意ExecutorChannel 方法可能是最好的方法,我会考虑在未来使用它
    • 对,ExpressionEvaluatingRequestHandlerAdvice 实际上只适用于handleRequstMessage - 当前AbstractReplyProducingMessageHandler 的范围。如果要“捕获”所有下游异常,则需要实现自己的HandleMessageAdvice。否则不,同一个线程中的所有异常都会被抛出,并且确实会停止下一个拆分项的处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2020-06-13
    • 2020-10-12
    相关资源
    最近更新 更多