这就是这种情况:
我有一个工作流,它等待文件夹中的文件,对其进行处理,然后将其发送到另一个系统。
由于不同的原因,我们在工作流的“子流程”之间使用ActiveMQ代理,其中,每条路由都会在最后一步发送消息之前以某种方式更改消息。除第一个和最后一个路由外,每个“子进程”都只能从ActiveMQ读写数据。
这也是工作流程的一部分,发送消息后有一条 路由,用于处理初始文件,移动或删除它。仅此路由知道与文件有关。
这意味着,在使用者路由完成后,文件必须保留在文件夹中,因为元数据只是写入ActiveMQ中,但实际的工作流程尚未完成。
使用文件使用者上的noop=true
参数可以使它工作。
问题是,在“发送路由之后”删除(或移动)文件之后,文件使用者将不会对新的同名文件做出反应,直到重新启动路由为止。
显然,这是预期的正确行为,因为它是noop
参数的要点,它会忽略以前使用过的文件,但这对我没有帮助。
现在的问题是,我如何让文件使用方只处理一次该文件(只要该文件存在于文件夹中),而一旦其他一些处理(在这种情况下为其他路由)删除,就“忘记”该文件文件。
作为替代方案,我可以让文件组件将文件移动到temp文件夹中,稍后再从该文件夹中进行处理,并将空值文件夹保留为空,但这引入了新的问题,我想避免(例如,移动只要第一个文件尚未完全处理,就将相同名称的文件放入文件夹中
我很想听听有关如何处理此案的一些想法。
问候克里斯
答案 0 :(得分:1)
您需要告诉Camel不仅使用文件名进行幂等检查。
在类似的情况下,我想对原本没有操作的文件进行更改,我可以选择
idempotentKey=${file:name}-${file:modified}
在我的网址中,该网址可确保您是否更改文件或创建新文件,都将其视为其他文件并进行处理。
请谨慎检查您可能正在处理的文件数量,因为默认情况下幂等缓冲区是有限的(我认为最多为1000条记录),因此,如果您一次可能处理1000个以上的文件,则可能会“忘记”它已经处理过文件1,当文件1001到达时,请再次尝试重新处理文件1。