2

我正在使用 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). 似乎我丢失的文件更少,但仍然丢失它们。如何避免?任何帮助将不胜感激。

4

1 回答 1

0

我遇到了类似的问题,我的是 2 个文件处理器从同一目录中检索。结果:丢失了我所有的文件。

这是场景:

  • Thread#1检索file1,移动到process文件夹
  • Thread#2检索相同file1的文件:同时。file1被删除
  • Thread#2file1在目录中找不到source,重命名失败。
  • Thread#1由于删除文件而失败Thread#2

原因如下:

如果您检查 GenericFileProcessStrategySupport.renameFile 方法,您会看到骆驼首先删除目标文件,然后将源文件重命名为目标。这就是为什么会出现上述情况


我不知道一个通​​用的解决方案,要么分离源消费者关系,要么实现工作分配机制。

由于您的线程位于同一个 JVM 中,我建议您实现一个并发负载分配器。这将以并发方式一次给请求者 1 个文件名

于 2015-06-29T12:47:58.993 回答