繁体   English   中英

Apache Camel ftp:具有幂等存储库,存储库值未删除

[英]Apache Camel ftp: with idempotent repository, repository value not removed

我有一个使用 Apache Camel 3 ftp 组件的 Spring Boot 2.5 应用程序。

该路由从 ftp 服务器读取并将文件写入本地文件系统。

将运行多个应用程序实例,因此需要文件锁定。 我正在使用 Redis 幂等存储库(RedisIdempotentRepository)。

我正在用 400 个文件测试锁的稳健性。

路线如下,密钥为 arguments。

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 文档中没有说明。

我已经尝试过了,它有效。 但经过几次测试迭代后,路由最终无法处理文件。 我不确定这是否是一个错误,但无法处理文件是不可接受的。

结合使用“idempotentRepository”和“inProgressRepository”也可以。 我注意到 ftp 组件将尝试添加回购条目两次。 但总的来说,它可以满足我的需要,而且看起来很健壮。

根据文档camel-ftp 默认情况下不会删除使用的文件。 由于从idempotentRepository中删除条目会导致 ftp 消费者端点一遍又一遍地处理文件,这正是 idempotentRepository 试图通过保留条目来防止的。

解决方法:

  1. 通过向文件添加时间戳或 guid 之类的内容来使用不同的文件名。
  2. 不要使用 idempotentRepository 而是使用选项delete=truemove=.done删除或移动文件到 hidden.done 目录
    • 如果您希望将已处理的文件移动到其他位置,例如单独的已处理文件夹,您可以使用move=/somepath/processed/${file:name}
    • 由于您使用的是recursive=true ,请务必将其放在 ftp 组件轮询新文件的文件夹之外。
  3. 创建和使用DummyIdempotentRepository允许多次读取同一个文件,无论如何。
    • 可能会导致您的readLock=idempotent设置出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM