【问题标题】:How to pass information between spring-integration components?如何在弹簧集成组件之间传递信息?
【发布时间】:2017-03-04 12:21:21
【问题描述】:

在spring-batch中,数据可以通过ExecutionContext在各个步骤之间传递。您可以在一个步骤中设置详细信息并在下一步中检索。我们在 spring-integration 中有这种东西吗?

我的用例是我必须从 ftp 位置获取一个文件,然后根据某些业务逻辑对其进行拆分,然后对其进行处理。根据文件名,客户端 ID 将被派生。此客户端 ID 将用于拆分器、服务激活器和聚合器组件。

根据我在春季的新手专业水平,我找不到任何可以帮助我共享特定运行状态的东西。我想知道 spring-integration 是否以某种方式提供了这种状态共享上下文。

如果有办法在 spring-context 中做,请告诉我。

【问题讨论】:

    标签: spring-integration spring-integration-sftp


    【解决方案1】:

    在 Spring Integration 应用程序中,没有用于状态共享的单个 ExecutionContext。相反,正如 Gary Russel 所提到的,每条消息都在其有效负载或标头中携带所有信息。

    如果您使用 Spring Integration Java DSL 并希望通过消息头传输 clientId,您可以使用 enrichHeader 转换器。提供HeaderEnricherSpec,它可以接受一个函数,该函数为指定的标头返回动态确定的值。根据您的用例,这可能如下所示:

    return IntegrationFlows
        .from(/*ftp source*/)
        .enrichHeaders(e -> e.headerFunction("clientId", this::deriveClientId))
        ./*split, aggregate, etc the file according to clientId*/
    

    ,其中deriveClientId 方法可能是一种:

    private String deriveClientId(Message<File> fileMessage) {
      String fileName = fileMessage.getHeaders().get(FileHeaders.FILENAME, String.class);
      String clientId = /*some other logic for deriving clientId from*/fileName;
      return clientId;
    }
    

    FILENAME 标头由 FTP 消息源提供)

    当您需要在下游流中的某处访问clientId 标头时,您可以使用与上述文件名相同的方式:

    String clientId = message.getHeaders().get("clientId", String.class);
    

    但请确保message 仍包含此类标头,因为它可能在中间流项目中的某个位置丢失。如果您在某个时候手动构建消息并进一步发送,则很可能会发生这种情况。为了不丢失前面消息中的任何标题,您可以在构建期间复制它们:

      Message<PayloadType> newMessage = MessageBuilder
          .withPayload(payloadValue)
          .copyHeaders(precedingMessage.getHeaders())
          .build();
    

    请注意,消息头在 Spring Integration 中是不可变的。这意味着您不能只添加或更改现有消息的标题。为此,您应该创建一条新消息或使用HeaderEnricher。上面介绍了这两种方法的示例。

    【讨论】:

      【解决方案2】:

      通常,您在消息负载本身的组件之间传递信息,或者通常通过消息头 - 请参阅Message ConstructionHeader Enricher

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多