Spring Integration文件拆分器锁

时间:2019-03-22 00:15:08

标签: spring spring-integration

我有一个集成流程,该流程从称为“促销”的消息通道读取文件,然后将其拆分并转换为每个文件的特定行,然后由ouboundAdapter在追加模式下逐行写入到称为“生成”的目录。 然后,我有一个入站适配器,该适配器以固定的延迟从轮询器的“生成的”目录中读取文件,并将文件移动到目标位置,以供其他应用程序选择。如何确保从第二个流程中挑选的文件是完整的?我看到的情况是入站适配器移动到仍由第一流写入的目标文件。可以将锁添加到正在写入“已生成”目录的文件中,以便进行第二个流程吗?

  private IntegrationFlow promoChannelSubscriber(File generatedDir, GenericSelector storesFilter) {
    return IntegrationFlows
      .from("promo")
      .filter(storesFilter)
      .split(
        Files.splitter()
          .applySequence(true)
      )
      .transform(this::enrichXstoreFileHeader)
      .handle(
        Files.outboundAdapter(generatedDir)
          .autoCreateDirectory(true)
          .fileExistsMode(APPEND)
          .appendNewLine(true)
      )
      .get();
  }

  private IntegrationFlow movePromotions(File generatedDir, Path destinationDirectory) {
    return IntegrationFlows.from(
      Files.inboundAdapter(generatedDir, comparingLong(File::lastModified))
        .regexFilter(fileNamePattern),
      cas -> cas.poller(
        Pollers.fixedDelay(2, TimeUnit.SECONDS)
          .maxMessagesPerPoll(promoConfig.getMaxMessagesPerPoll())
          .errorChannel(errorChannelName)
      ))
      .handle(
        Files.outboundAdapter(destinationDirectory.toFile())
          .deleteSourceFiles(true)
          .temporaryFileSuffix(".tmp")
      )
      .get();
  }

谢谢

1 个答案:

答案 0 :(得分:0)

为什么要使用2个流?为什么在收到最后一个拆分时不执行第二个流程?

如果必须使用2个流,则需要写入一个与第二个流的过滤器不匹配的临时文件名。

然后,在文件完成后,将文件重命名为其最终名称。

您可以使用标记消息和路由器来检测文件结束情况。

有关示例,请参见file-split-ftp sample application