20.23. 避免多次读取同一文件(幂等消费者)
Camel 支持在组件中直接支持 Idempotent Consumer,以便它跳过已处理的文件。该功能可通过设置 idempotent=true 选项来启用。
from("file://inbox?idempotent=true").to("...");
from("file://inbox?idempotent=true").to("...");
Camel 使用绝对文件名作为幂等键,以检测重复的文件。您可以使用 idempotentKey 选项中的表达式自定义此密钥。例如,要将名称和文件大小用作密钥
<route>
<from uri="file://inbox?idempotent=true&idempotentKey=${file:name}-${file:size}"/>
<to uri="bean:processInbox"/>
</route>
<route>
<from uri="file://inbox?idempotent=true&idempotentKey=${file:name}-${file:size}"/>
<to uri="bean:processInbox"/>
</route>
默认情况下,Camel 使用基于内存的存储来跟踪消耗的文件,它使用最最近使用的缓存最多 1000 个条目。您可以使用值中的 # 号来 插入 此存储自己的实施,以指示它在带有指定 id 的 Registry 中引用 bean。
如果由于之前已被使用,Camel 会在 DEBUG 级别中跳过一个文件,则 Camel 将在:
DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file: target\idempotent\report.txt
DEBUG FileConsumer is idempotent and the file has been consumed before. Will skip this file: target\idempotent\report.txt