删除集群中已处理的文件 apache-camel

Delete processed file apache-camel in a cluster

我使用 apache camel 来处理在 ftp 频道上收到的文件。我的应用程序部署在一个集群(4 个节点)中,为此我使用 RedisIdempotentRepository 来确保单个节点处理文件。我的问题是我想在处理后删除文件,如果我使用delete=true,处理文件的节点A完成后将删除文件,节点B已经删除了它,因为节点B不会去通过过滤器,因此它会直接访问删除。

我想知道如何只允许节点A删除文件?

from("sftp://host:port/folder?delete=true)
 .idempotentConsumer(simple("${file:onlyname}"),
     RedisIdempotentRepository.redisIdempotentRepository(redisTemplate, "camel-repo"))
 .bean("orderTrackingFileProcessor");

配置 ftp 端点直接使用 redis 幂等存储库,而不是之后路由中的幂等消费者 EIP。这确保只有 1 ftp 个消费者正在处理同一个文件。

如果你有 Camel in Action 第 2 版,它会在交易章节的第二部分介绍。

我使用 pollEnrich 来解决这个问题:

在处理结束时添加删除步骤:

.pollEnrich(remoteLocation + "?delete=true&fileName=${file:name}");

完整示例路线:

String remoteLocation = "sftp://host:port/folder";

from(remoteLocation)
 .idempotentConsumer(simple("${file:onlyname}"),
     RedisIdempotentRepository.redisIdempotentRepository(redisTemplate, "camel-repo"))
 .bean("orderTrackingFileProcessor")
 .pollEnrich(remoteLocation + "?delete=true&fileName=${file:name}");