使用 Spring 集成 DSL 的中流文件采购

Mid-flow file sourcing with Spring Integration DSL

我需要创建一个流程,每当在一个文件夹中收到一个文件时,它就会从另一个文件夹中挑选一些其他预先存在的文件,转换所有这些文件(包括新收到的)使用相同的 transformer 然后聚合它们以创建单个输出。 我想我可以使用 splitter-aggregator 方法来执行转换和聚合步骤;但我不知道我可以使用哪种 SI 组件类型(如果有的话)将新文件(从启动流程执行的原始 MessageSource 收到的文件)与现有文件合并到同一个文件中流.

我正在处理的项目使用 spring-integration-core-5.0.11.RELEASEspring-integration-file-5.0.11.RELEASE,我们正在使用 Spring Integration DSL 创建流程。

请考虑使用a。 .enrich() EIP-method:

/**
 * Populate a {@link org.springframework.integration.transformer.ContentEnricher}
 * to the current integration flow position
 * with provided options.
 * Typically used with a Java 8 Lambda expression:
 * <pre class="code">
 * {@code
 *  .enrich(e -> e.requestChannel("enrichChannel")
 *                  .requestPayload(Message::getPayload)
 *                  .shouldClonePayload(false)
 *                  .autoStartup(false)
 *                  .<Map<String, String>>headerFunction("foo", m -> m.getPayload().get("name")))
 * }
 * </pre>
 * @param enricherConfigurer the {@link Consumer} to provide
 * {@link org.springframework.integration.transformer.ContentEnricher} options.
 * @return the current {@link IntegrationFlowDefinition}.
 * @see EnricherSpec
 */
public B enrich(Consumer<EnricherSpec> enricherConfigurer) {

通过这种方式,您可以根据请求消息调用任何您需要的内容,并将所有内容存储在输出负载中。

请在 Reference Manual 中查看有关 Enricher 的更多信息。

你也可以看看sample。我知道一个在XML配置上,但原理是一样的。

更新

对于这个技巧,您需要将您的请求 File 包装到 Collection(当然是 List)以及您刚刚添加到此集合中的所有其他文件简单 addAll() 表达式。

另一个更好的解决方案是 .gateway()。因此,您将文件发送到那里,并与其他人一起 return a Collection。这样一来,您的流程应该足够顺畅,只需处理上游的一个文件和下游的集合。