spring-integration:入站适配器的错误处理

时间:2015-05-14 18:59:40

标签: spring-integration

基础:

  • 使用spring 4.1.1进行集成,引导和1.0.0的DSL。
  • 不同计划的多个入站SFTP适配器从不同供应商处获取文件。
  • 每个集成流程都会在下载文件后将标题附加到邮件中,以识别供应商来源。
  • 使用MessagePublishingErrorHandler处理异常。
  • 标准消息流在成功处理消息或消息无法完成时通知外部监视解决方案。使用邮件头来标识哪个流失败。

在我们收到消息后,成功和错误流程都很有效。但是,当我们遇到在生成邮件之前发生的错误(即无法连接到sftp服务器)时,我们就没有机会附加邮件头。

我一直在查看示例和文档,我找不到从MessagePublishingErrorHandler生成的错误消息中附加相同标头的好方法,而不会覆盖Poller上的错误处理程序,或者创建自定义错误每个入站集成的流程。我有什么选择?

这是其中一个配置的示例:

        IntegrationFlows
        .from(
            Sftp.inboundAdapter(sessionFactory)
                    .autoCreateLocalDirectory(true)
                    .localDirectory(configProperties.getLocalDirectory())
                    .preserveTimestamp(true)
                    .remoteDirectory(configProperties.getRemoteDirectory()),
            c -> c.poller(Pollers
                    .fixedRate(properties.getSftpInterval(), properties.getSftpIntervalUnit())
                    .errorHandler(errorHandler)) // custom error handler?
        )
        .enrichHeaders(
                    MapBuilder
                            .with("vendorName", "vendor1")
                            .get()
        )
        .channel("fileChannelHandler")
        .get();

1 个答案:

答案 0 :(得分:1)

是的 - 问题在于,使用轮询通道适配器,如果在MessageSource.receive()中抛出异常,则还没有任何消息需要通过自定义标头进行增强。

框架目前不允许修改ErrorMessage本身的标头(其原始异常作为此类异常的有效负载)。

一个解决方法(除了你的自定义EH)将在每个错误流上添加一个标题来识别源适配器。

将来,框架可以向ErrorMessage添加一个标头,其中包含通道适配器的id,因此可以在常见的错误流中识别源。

随意打开'改进'JIRA Issue我们会看看。