1

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

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

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

请让我知道是否有办法在 spring-context 中做。

4

2 回答 2

2

在 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用于该目的。上面介绍了这两种方法的示例。

于 2017-03-06T10:01:29.250 回答
1

通常,您在消息有效负载本身的组件之间传递信息,或者通常通过消息标头 - 请参阅消息构造标头丰富器

于 2017-03-04T12:57:33.110 回答