当前位置: 首页 > 知识库问答 >
问题:

spring集成:入站适配器上的错误处理

冯胤
2023-03-14

基础知识:

  • 使用带集成的Spring 4.1.1,引导和1.0.0的DSL。
  • 多个入站SFTP适配器在不同的时间表上从不同的供应商获取文件。
  • 每个集成流在文件下载后将标头附加到消息中,以标识供应商源。
  • 使用MessagePublishingErrorHandler处理异常。
  • 标准消息流在消息处理成功或消息未能完成时通知外部监控解决方案。使用消息头来识别哪个流失败。

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

我一直在查看示例和留档,我找不到一个好方法来从MessagePublishingErrorHandler产生的错误消息中附加相同的头,而不覆盖轮询器上的错误处理程序,或者为每个入站集成创建自定义错误流。这里有什么选项?

这是一个配置示例

        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个答案

蒋寒
2023-03-14

是的-问题是,对于轮询的通道适配器,如果在消息源中抛出异常。receive(),目前还没有任何消息可以通过自定义标题进行增强。

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

一个解决方法(除了自定义EH之外)是在每个错误流上放置一个头enricher,以识别源适配器。

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

欢迎打开一个“改进”JIRA问题,我们来看看。

 类似资料:
  • 我如何处理在Spring整合中未能向Kafka传达的信息? 我在“int kafka:outbound channel adapter”中没有看到“error channel”是一个选项,我想知道应该在哪里添加错误通道信息,以便我的ErrorHandler可以获得“failed to kafka”类型的错误。(包括所有类型的故障、配置、网络等) 此外,inputToKafka是排队通道,我应该在哪

  • 问题内容: 入站和出站通道适配器之间的根本区别是什么? 任何示例都将非常有帮助。 我已经查看过Spring文档,这种“方向性”的区别对我来说还不清楚。我支持配置了outbound-channel-adapter的应用程序,但是我发现使用 出站 标签可以直观地了解行为计数器。该适配器获取一个外部文件,然后 将其 引入应用程序中, 在 该应用程序中我们解析文件并保留数据。 这类似于这个问题,但是我想更

  • 我正在尝试构建一个集成解决方案,其中 我的outboundgateway定义为 请求工厂在哪里 快乐之路运行良好,我面临的问题是不太快乐的道路。 当Api调用返回错误响应时。转换(exetrnaldto到dto)失败,客户端获得500 我想把error resposne json也翻译成我的json 我如何处理错误情况 我的问题是: 如何处理错误。 在错误条件下如何停止流不转换 如何将状态代码从出

  • 我是Spring整合的新手。 我有一个流,根据某些条件,我需要在其上执行超文本传输协议或tcp调用。我关注的问题与超文本传输协议调用有关。调用的其余endpoint需要一个访问令牌作为身份验证的标头参数,该参数由具有2个方法和的Spring服务提供。我想仅在过期时调用方法刷新。 我想做的是在执行对rest api的调用时添加以下逻辑: 如果令牌过期,restendpoint返回401,我希望在流中

  • 我试图将从Quickfix读取消息(读取修复消息)配置到spring集成中。我知道我可以使用入站通道适配器从外部源(如QuickFix)读取数据。您能提供如何编写事件驱动入站通道适配器的示例吗?我有以下配置不起作用

  • 我们在Oracle Weblogic 10.3.6服务器中有两个节点的集群环境,它是循环的。 我有一个服务,它从外部系统获取消息并将它们放入数据库(Oracle DB)。 我正在使用jdbc入站适配器转换这些消息并将其传递到通道。一条消息只处理一次。我计划在DB表中有一列(NODE\u NAME)。当从外部系统获取消息的第一个服务也使用NODE_名称(weblogic.NAME)更新列时。在jdb