在具有直接通道的消息拆分器之后处理错误

时间:2017-10-03 13:53:06

标签: spring-integration spring-integration-dsl

我正致力于使用spring integration 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();
    }

1 个答案:

答案 0 :(得分:0)

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

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

另一方面,如果您正在谈论"发送电子邮件",那么最好考虑在每个拆分项目的单独线程中执行此操作吗?在这种情况下,ExecutorChannel之后.split()来救援!