我使用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");
答案 0 :(得分:0)
将ftp端点配置为直接使用redis idempotent存储库,而不是之后路由中的幂等消费者EIP。这确保只有1 ftp的消费者正在处理同一个文件。
如果你有第二版的Camel in Action,它将在交易章节的后半部分进行讨论。
答案 1 :(得分:0)
我使用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}");