我正在使用Apache Camel 2.11.1
有这样的路线:
from("file:///somewhere/").
threads(20).
to("direct:process")
有些时候我收到了这个例外:org.apache.camel.InvalidPayloadException
带有消息
No body available of type: java.io.InputStream but has value: GenericFile[/somewhere/file.txt] of type:
org.apache.camel.component.file.GenericFile on: file.txt. Caused by: Error during type conversion from type:
org.apache.camel.component.file.GenericFile to the required type: byte[] with value GenericFile[/somewhere/file.txt]
due java.io.FileNotFoundException: /somewhere/file.txt (No such file or directory).
由于我在目录中看到很多.camelLock文件,我认为这是因为尝试几个线程来处理同一个文件。如何避免?
更新1
尝试使用scheduledExecutorService
并删除threads(20)
。似乎我丢失的文件较少,但仍然丢失了。怎么避免?任何帮助将不胜感激。
答案 0 :(得分:0)
我遇到了类似的问题,我的是从同一目录检索的2个文件处理器。结果:丢失了我的所有文件。
以下是该方案:
Thread#1
检索file1
,移至process
文件夹Thread#2
同时检索同一文件:file1
。 file1
已删除Thread#2
在file1
目录中找不到source
,重命名失败。Thread#1
删除了文件,Thread#2
失败
原因如下:
如果检查GenericFileProcessStrategySupport.renameFile方法,您将看到camel首先删除目标文件,然后将源文件重命名为target。这就是上述情况发生的原因
我不了解通用解决方案,应该实现分离源 - 消费者关系或实现工作分配机制。
当您的线程存在于同一个JVM中时,我建议您实现并发负载分配器。这将以并发方式一次为请求者提供1个文件名