我有一个使用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条目两次。但总的来说,它做了我需要的,而且看起来很健壮。
1条答案
按热度按时间nwlqm0z11#
根据文档,camel-ftp默认情况下不会删除使用的文件。因此,从
idempotentRepository
中删除条目会导致ftp使用者端点反复处理该文件,而这正是idempotentRepository试图通过保留该条目来防止的。解决方法:
1.通过在文件中添加时间戳或guid之类的内容来使用不同的文件名。
delete=true
或move=.done
删除或移动文件到隐藏的.done目录move=/somepath/processed/${file:name}
的内容recursive=true
,因此请确保将其放置在ftp组件轮询新文件的文件夹之外。readLock=idempotent
设置出现问题。