Spring integration 如何在spring集成组件之间传递信息?

Spring integration 如何在spring集成组件之间传递信息?,spring-integration,spring-integration-sftp,Spring Integration,Spring Integration Sftp,在SpringBatch中,可以通过ExecutionContext在各个步骤之间传递数据。您可以在一个步骤中设置详细信息,然后在下一个步骤中检索。我们在spring集成中有这样的产品吗 我的用例是,我必须从ftp位置提取一个文件,然后根据特定的业务逻辑将其拆分,然后对其进行处理。根据文件名,将导出客户端id。此客户端id将用于拆分器、服务激活器和聚合器组件中 从我在spring的新手水平来看,我找不到任何东西可以帮助我共享特定运行的状态。我想知道spring集成是否以某种方式提供了这种状态共享

在SpringBatch中,可以通过ExecutionContext在各个步骤之间传递数据。您可以在一个步骤中设置详细信息,然后在下一个步骤中检索。我们在spring集成中有这样的产品吗

我的用例是,我必须从ftp位置提取一个文件,然后根据特定的业务逻辑将其拆分,然后对其进行处理。根据文件名,将导出客户端id。此客户端id将用于拆分器、服务激活器和聚合器组件中

从我在spring的新手水平来看,我找不到任何东西可以帮助我共享特定运行的状态。我想知道spring集成是否以某种方式提供了这种状态共享上下文


请让我知道在spring上下文中是否有这样做的方法。

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

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

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

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

返回集成流
.from(/*ftp源*/)
.enrichHeaders(e->e.headerFunction(“clientId”,this::deriveClientId))
./*根据clientId拆分、聚合文件等*/
,其中,
deriveClientId
方法可能是一种:

私有字符串deriveClientId(Message fileMessage){
String fileName=fileMessage.getHeaders().get(FileHeaders.fileName,String.class);
字符串clientId=/*用于从*/fileName派生clientId的其他逻辑;
返回客户ID;
}
FILENAME
标题由FTP消息源提供)

当您需要访问下游流中某个位置的
clientId
头时,您可以使用与上面提到的文件名相同的方法:

String clientId=message.getHeaders().get(“clientId”,String.class);
但是要确保
消息
仍然包含这样的标题,因为它可能在中间流项目中的某个地方丢失了。如果在某个时刻手动构造消息并进一步发送,则可能会发生这种情况。为了不丢失前面消息中的任何标题,您可以在构建过程中复制它们:

Message newMessage=MessageBuilder
.带有效载荷(有效载荷值)
.copyHeaders(precingMessage.getHeaders())
.build();

请注意,消息头在Spring集成中是不可变的。这意味着您不能只添加或更改现有消息的标题。为此,您应该创建新邮件或使用
header
。以上给出了两种方法的示例。

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

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

返回集成流
.from(/*ftp源*/)
.enrichHeaders(e->e.headerFunction(“clientId”,this::deriveClientId))
./*根据clientId拆分、聚合文件等*/
,其中,
deriveClientId
方法可能是一种:

私有字符串deriveClientId(Message fileMessage){
String fileName=fileMessage.getHeaders().get(FileHeaders.fileName,String.class);
字符串clientId=/*用于从*/fileName派生clientId的其他逻辑;
返回客户ID;
}
FILENAME
标题由FTP消息源提供)

当您需要访问下游流中某个位置的
clientId
头时,您可以使用与上面提到的文件名相同的方法:

String clientId=message.getHeaders().get(“clientId”,String.class);
但是要确保
消息
仍然包含这样的标题,因为它可能在中间流项目中的某个地方丢失了。如果在某个时刻手动构造消息并进一步发送,则可能会发生这种情况。为了不丢失前面消息中的任何标题,您可以在构建过程中复制它们:

Message newMessage=MessageBuilder
.带有效载荷(有效载荷值)
.copyHeaders(precingMessage.getHeaders())
.build();
请注意,消息头在Spring集成中是不可变的。这意味着您不能只添加或更改现有消息的标题。为此,您应该创建新邮件或使用
header
。以上给出了两种方法的示例