使用多个线程消耗骆驼中的文件

时间:2013-09-20 09:39:20

标签: apache-camel

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

1 个答案:

答案 0 :(得分:0)

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

以下是该方案:

  • Thread#1检索file1,移至process文件夹
  • Thread#2同时检索同一文件:file1file1已删除
  • Thread#2file1目录中找不到source,重命名失败。
  • 由于Thread#1 删除了文件,
  • Thread#2失败

原因如下:

如果检查GenericFileProcessStrategySupport.renameFile方法,您将看到camel首先删除目标文件,然后将源文件重命名为target。这就是上述情况发生的原因

我不了解通用解决方案,应该实现分离源 - 消费者关系或实现工作分配机制。

当您的线程存在于同一个JVM中时,我建议您实现并发负载分配器。这将以并发方式一次为请求者提供1个文件名