Parallel processing 并行处理时不考虑Apache Camel调度程序延迟
在使用ApacheCamel(3.6.0)的SpringBoot(2.3.0.RELEASE)应用程序上,我在并行模式下遇到了调度程序组件的奇怪行为;特别是,我想创建一个路由,它每n秒执行一个给定的逻辑。 为此,我编写了以下示例:Parallel processing 并行处理时不考虑Apache Camel调度程序延迟,parallel-processing,apache-camel,delay,scheduler,Parallel Processing,Apache Camel,Delay,Scheduler,在使用ApacheCamel(3.6.0)的SpringBoot(2.3.0.RELEASE)应用程序上,我在并行模式下遇到了调度程序组件的奇怪行为;特别是,我想创建一个路由,它每n秒执行一个给定的逻辑。 为此,我编写了以下示例: @Component public class TestRoute extends RouteBuilder { @Override public void configure() { from("scheduler:testRoute?de
@Component
public class TestRoute extends RouteBuilder {
@Override
public void configure() {
from("scheduler:testRoute?delay=2000")
.log(LoggingLevel.INFO, "Test route begin")
.setBody(this::generateRandomBody)
.split(body())
.parallelProcessing()
.process(this::consumeElement)
.end()
.log(LoggingLevel.INFO, "Test route end");
}
private List<Integer> generateRandomBody(Exchange exchange) {
return IntStream.range(0, random(20)).boxed().collect(toList());
}
private void consumeElement(Exchange exchange) throws InterruptedException {
Thread.sleep(random(1000));
}
private int random(int max) {
return new Random().nextInt(max) + 1;
}
下面是一个没有并行处理的输出示例:
09:02:56.859 Test route begin
09:02:58.086 Test route end
09:02:58.868 Test route begin
09:02:59.266 Test route end
09:03:00.870 Test route begin
09:03:01.654 Test route end
09:03:02.871 Test route begin
09:03:04.028 Test route end
09:03:04.873 Test route begin
09:08:01.666 Test route begin
09:08:11.290 Test route end
09:08:13.292 Test route begin
09:08:21.707 Test route end
09:08:23.709 Test route begin
09:08:26.161 Test route end
09:08:28.162 Test route begin
09:08:37.761 Test route end
09:08:39.763 Test route begin
如您所见,在并行处理时,延迟不受影响,因为下一次轮询时间是根据当前轮询开始计算的;另一方面,在没有并行处理的情况下,下一次轮询时间约为当前轮询结束后2秒
这似乎有点奇怪,因为并行处理文档说明:
如果启用,则同时处理每个拆分的消息。注意:调用线程仍将等待所有消息完全处理完毕,然后继续。它只处理来自拆分器的同时发生的子消息
我错过了什么?如何并行处理消息并在实际路由完成后触发下一次轮询?在Camel 3中,EIP已被大修为反应式,因此拆分器允许调度程序线程更快完成,因此可以接受2秒的延迟 如果希望计划的事务等待整个交换完成(无论不同线程如何处理它),则需要将其配置为同步。即使是骆驼2
from("scheduler:testRoute?delay=2000&synchronous=true")
现在它工作得很好!我不知道还有什么比这更棒:你的产品还是你令人难以置信的快速回复:-)谢谢