是否有可能在骆驼路线上有一个分离器池

时间:2014-06-09 19:49:21

标签: apache-camel

我正在使用Splitter来分解大文件,对分割进行一些处理,然后使用自定义AggregationStrategy将更新的分割保存到新文件中。分路器配置为流式但不是并行处理。这很好。

问题是Splitter调用doAggregate(继承自MulticastProcessor)并进行同步。当该路由上存在并发请求时,性能会受到同步的显着影响。显然,并发请求越多,就越糟糕。

有没有办法创建可用于路由的拆分器实例池?每个传入的交换机可以使用不同的拆分器实例,从而避免同步的doAggregate调用。是否可以利用自定义ProcessorFactory来执行此操作?

更新

我创建了一个简单的测试来演示我正在谈论的内容。 我有这样的路线

from("direct:splitterTest").split(method(new MySplitter(), "rowIterator"), new MyAggregationStrategy()).to("log:someSplitProcessing?groupSize=500")

MySplitter只返回10000 String []的迭代器,它模拟读取文件。

MyAggregationStrategy假装执行一些工作并将记录保存到新文件中。 在我的测试中,我添加了循环来模拟像

这样的处理
Random random = new Random(System.currentTimeMillis());
for (int i = 0; i < 10000; i++) {
    random.nextGaussian();
}

我向这样的路径提交请求(不是说我在这种情况下没有传入文件,因为拆分器只是返回虚拟数据):

ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
Future<File> future1 = producerTemplate.asyncRequestBody("direct:splitterTest", null, File.class);
Future<File> future2 = producerTemplate.asyncRequestBody("direct:splitterTest", null, File.class);
System.out.println(future1.get());
System.out.println(future2.get());

我想发布visualvm屏幕截图,显示2和4个并发的机上交换如何受同步影响,但此帐户太新,无法发布图片。

重点是这一点。创建路由时,该路由只有一个Splitter实例。该路由上的多个机上交换将在doAggregate调用中同步,这严重影响每个请求的处理时间。当有4个请求时,您可以看到3个线程被阻塞而其中一个在doAggregate调用中。

由于我正在进行的处理的性质,我无法将拆分器配置为并行处理,因此我正在寻找的是一种创建多个拆分器实例的方法。我可以创建4个路径副本,然后使用routingSlip或dynamicRouter来循环请求每个但这看起来很难看,我希望有更好的方法。

1 个答案:

答案 0 :(得分:1)

如果您想要doAggregate,您可以使用自己的线程池并行保存。