【问题标题】:Parallel processing of multiple files using Apache Camel使用 Apache Camel 并行处理多个文件
【发布时间】:2019-03-19 06:03:51
【问题描述】:

我有数千个文件要单独处理。 我使用 Apache Camel 处理文件

from("file:C:\datafiles\input?readLock=changed&readLockTimeout=100&readLockCheckInterval=20") .process(new MyProcessor()).to("file:C:\datafiles\output");

我一次做一个文件,需要 30 分钟。

我想我可以在 10 个并发线程中同时处理 10 个文件,并且我可以在 3 分钟而不是 30 分钟内完成。

我的问题是,实现我的 10 个线程的“正确”方法是什么?当一个完成后,创建一个新的,最大数量为 10。

当我搜索互联网时,我得到了一些建议,例如使用

  1. maxMesssagesPerPoll
  2. 线程(10)
  3. 聚合器

但我这里与聚合器没有任何关系,只需要从一个远程位置处理每个文件,处理它,然后将它们放在另一个远程位置。

【问题讨论】:

  • 创建多个 Route 实例是在网上找到的另一个选项。但我正在寻找使用多线程方法而不是新的 RouteBuilder 实例的选项。由于给定的参考我搜索的内容不适合我的实现,希望这会有所帮助。
  • 线程池和 seda 队列是我用来做并行导入的。我们可以看看一些代码吗?
  • from("file:C:\datafiles\input?readLock=changed&readLockTimeout=100&readLockCheckInterval=20") .process(new MyProcessor()).to("file:C:\datafiles\output" );

标签: java parallel-processing apache-camel


【解决方案1】:

可以使用下面的代码实现多线程。

public class RouterConfig extends RouteBuilder {
    public void configure() throws Exception {
        from("file:C:\datafiles\input?readLock=changed&readLockTimeout=100&readLockCheckInterval=20&maxMessagesPerPoll=3") 
        .threads(3, 3, "myThread")
        .process(new MyProcessor())
        .to("file:C:\datafiles\output");
    }
}

这里的线程 api 将创建 3 个线程。 maxMessagesPerPoll=3 将在一次轮询中选择 3 个文件并将一个文件传递给一个线程,就像这里它选择 3 个文件(file1、file2、file3)并给一个文件 3 个线程(thread1、thread2、thread3)一样。

  • 因此,“file1”将由“thread1”处理,并且
  • “file2”将被“thread2”处理
  • “file3”将被“thread3”处理

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多