Camel SFTP如何防止多个节点处理同一个文件?

hwamh0ep  于 9个月前  发布在  Apache
关注(0)|答案(2)|浏览(91)

这是我的路线

from("sftp://userName:password@ip:22/<my-folder>?move=.done")
        .routeId("my-route-1")
        .<processing-logic>

如何避免在多个示例中处理相同的文件?

hxzsmxv2

hxzsmxv21#

Camel最近引入了一些有趣的集群功能-请参阅here
在您的特定情况下,您可以在启动目录轮询时建模一个处于领导地位的路由,从而防止其他节点拾取(相同或其他)文件。
设置它非常容易,你所需要的就是根据主组件语法给单例端点加上前缀:master:namespace:delegateUri
这将导致类似这样的结果:

from("master:mycluster:sftp://...")
        .routeId("clustered-route")
        .log("Clustered sftp polling !");
nfeuvbwi

nfeuvbwi2#

您可以使用基于文件的幂等存储库。
使用基于文件的幂等存储库
我举个例子,

FileIdempotentRepository sftpIdempotentRepository = new FileIdempotentRepository();

sftpIdempotentRepository.setFileStore(new File("where to store it"));

exchange.getContext().getRegistry().bind("sftpIdempotentRepository", sftpIdempotentRepository);

完成此配置后,您必须将这些参数添加到SFTP路由器。

from("sftp://userName:password@ip:22/<my-folder>?move=.done&idempotent=true&idempotentKey=${file:name}-${file:size}&idempotentRepository=#sftpIdempotentRepository")
        .routeId("my-route-1")
        .<processing-logic>

它会将从SFTP读取的文件存储在幂等文件中(文件名+文件大小),并防止再次处理同一文件。
您可以根据需要更改idempotentKey值。

相关问题