情况就是这样:
我有一个工作流,它在文件夹中等待文件,对它们进行处理,然后将它们发送到另一个系统。
由于不同的原因,我们在工作流中的“子进程”之间使用ActiveMQ代理,在最后一步发送消息之前,每个路由都会以某种方式更改消息。除第一条和最后一条路由外,每个“子进程”只读写ActiveMQ。
它也是工作流的一部分,在发送消息之后有一条路由,它处理初始文件、移动或删除它。只有这个路径知道这与文件有关。
这意味着,在用户路由完成后,文件必须留在文件夹中,因为元数据只是写入ActiveMQ,但是实际的工作流还没有完成。
它使用文件使用者上的noop=true
参数来工作。
这方面的问题是,在“发送路由”删除(或移动)文件之后,文件使用者在重新启动路由之前不会再次响应同名的新文件。
很明显,这是预期的、正确的行为,因为忽略以前使用过的文件是noop
参数的要点,但这对我没有帮助。
现在的问题是,如何让文件使用者只处理一次文件,只要它存在于文件夹中,但只要其他进程(在本例中是另一条路径)移除该文件,就“忘记”它。
作为另一种选择,我可以让文件组件将文件移动到临时文件夹中,然后在那里进行处理,然后将合并文件夹保持为空,但这会带来新的问题,这是我想要避免的(例如,将同名的文件移动到文件夹中,只要第一个文件尚未完全处理)。
我很想听听关于如何处理那个案子的一些想法。
问候克里斯
发布于 2019-07-12 00:59:38
你需要告诉骆驼不仅要使用文件名进行幂等性检查。
在类似的情况下,如果我想获取对一个文件的更改,而该文件是未进行操作的,那么我可以选择。
idempotentKey=${file:name}-${file:modified}
在我的url中,它确保如果您更改了文件,或者创建了一个新的文件,它会将它作为一个不同的文件来处理。
一定要检查您可能正在处理的文件数量,因为幂等缓冲区在默认情况下是有限的(我认为是1000条记录),所以如果您一次可能处理超过1000个文件,那么当文件1001到达时,它可能会“忘记”它已经处理的文件1,然后再次尝试重新处理文件1。
https://stackoverflow.com/questions/57002658
复制