Apache Camel文件传输协议:使用幂等资料档案库,未删除资料档案库值

new9mtju  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(203)

我有一个使用Apache Camel 3 ftp组件的Sping Boot 2.5应用程序。
该路由从ftp服务器读取文件并将文件写入本地文件系统。
多个应用程序示例将运行,因此需要文件锁定。我使用的是Redis的幂等仓库(RedisIdempotentRepository)。
我正在用400个文件测试锁的健壮性。
路线如下,并附有关键参数。

from("ftp://" + ftpHost +
                "/" + ftpRootDirectory +
                "&localWorkDirectory=" + declarationRootDirectory +
                "&delay=5s" +
                "&readLock=idempotent" +
                "&recursive=true&binary=true&delete=true" +
                "&idempotent=true&shuffle=true" +
                "&readLockRemoveOnCommit=true" +
                "&idempotentRepository=#ftdFtpIdempotentRepository"
.to("file://" + declarationRootDirectory);

使用上面的方法,文件名会添加到存储库中,但在处理文件后不会删除。以下参数似乎不起作用。'readLockRemoveOnCommit=true'
如果不删除该键,则ftp服务器上的另一个同名文件将不会被处理。我真的不想让它成为一个驱逐策略。我假设ftp组件应该从存储库中删除该条目。
有人能指出为什么回购条目没有被删除吗?
查看源代码,似乎只有InProgressRepository会删除repo条目。这在Camel文档中没有说明。
我已经试过了,它工作。但是经过几次测试迭代后,路由最终无法处理文件。我不确定这是否是一个错误,但无法处理文件是不可接受的。
使用'idempotRepository'和'inProgressRepository'的组合也可以。我注意到ftp组件将尝试添加repo条目两次。但总的来说,它做了我需要的,而且看起来很健壮。

nwlqm0z1

nwlqm0z11#

根据文档,camel-ftp默认情况下不会删除使用的文件。因此,从idempotentRepository中删除条目会导致ftp使用者端点反复处理该文件,而这正是idempotentRepository试图通过保留该条目来防止的。

解决方法:

1.通过在文件中添加时间戳或guid之类的内容来使用不同的文件名。

  • 不要使用idempotRepository,而是使用选项delete=truemove=.done删除或移动文件到隐藏的.done目录
  • 如果您喜欢将已处理的文件移动到其他地方,如单独的已处理文件夹,您可以使用类似move=/somepath/processed/${file:name}的内容
  • 由于您使用的是recursive=true,因此请确保将其放置在ftp组件轮询新文件的文件夹之外。
  • 创建和使用DummyIdempotentRepository,允许多次阅读同一文件,无论什么。
  • 可能会导致readLock=idempotent设置出现问题。

相关问题