Asynchronous ApacheCamel:将同步直接转换为异步

Asynchronous ApacheCamel:将同步直接转换为异步,asynchronous,apache-camel,Asynchronous,Apache Camel,我的问题与这次讨论非常接近:。我也被direct的同步行为抓住了 我设计了这样一个应用程序: 路线1: from(直接:第1步输入)。进程(…)。to(直接:第1步输出) 路线2: 从(直接:第2步输入)。进程(…)。到(直接:第2步输出) CoreRoute(连接所有步骤): 从(直接:第1步输出)。到(直接:第2步输入) 一年后,我仍然喜欢这种方法。我可以单独实现和测试这些步骤,例如,如果需要解耦,可以切换到seda:step1 out 但是seda是一种相当繁重的去耦方法:创建一个队列和一

我的问题与这次讨论非常接近:。我也被direct的同步行为抓住了

我设计了这样一个应用程序:

路线1: from(直接:第1步输入)。进程(…)。to(直接:第1步输出)

路线2: 从(直接:第2步输入)。进程(…)。到(直接:第2步输出)

CoreRoute(连接所有步骤): 从(直接:第1步输出)。到(直接:第2步输入)

一年后,我仍然喜欢这种方法。我可以单独实现和测试这些步骤,例如,如果需要解耦,可以切换到seda:step1 out

但是seda是一种相当繁重的去耦方法:创建一个队列和一个线程池,其中包含固定数量的线程。所以,即使你大部分时间需要1个线程,有时需要100个线程,你也会一直使用100个线程

有时您只想释放当前线程,因为它应该已经解压下一个文件,而不是处理当前线程

从文档中,我了解到您将使用线程(1100)来实现此目的:

from(直接:输入列表处理器)。split(body())。threads(1100)。delay(1000)。process(…)。to(单步进程解压)

但此将阻止将exchange路由到直接输入列表处理器的线程,直到所有线程完成处理


相反,我希望将交换复制到后续线程,并完成当前的交换。

感谢克劳斯的评论,我提出了以下内容,似乎可以使用wireTap实现我想要的功能:

from("direct:step1-in").to("direct:step1-out");
from("direct:step2-in")
    .log("receive async")
    .delay(1000).to("log:output");
// core route connecting processing step1 and processing step2
from("direct:step1-out").log("send async").wireTap("direct:step2-in")       
  .executorService(getContext().getExecutorServiceManager().newThreadPool(this, 
       "step2-worker", 1, 100));
我认为这是一条路要走。虽然我很困惑,因为 《骆驼行动手册》建议:10.4.3使用多个 线程

这是最明显的方法,但正如本文所述:这不是一种方法,因为它可能会结束,建议的使用direct而不是seda的替代方法对我不起作用,因此这个问题。此外,seda方式有一个无限队列,这是一个潜在的“内存泄漏”,因此每次使用此模式时,您都需要确定并设置适当的大小

@克劳斯非常感谢你的伟大工作!你的回答在很大程度上引导我完成了这个项目。也许你可以澄清一下,如果你认为这是一个好的解决方案,或者我仍然遗漏了什么。我看到的唯一“缺点”是将创建一个新的交换,而且一个事务不会跨越多个处理步骤

此日志显示wireTap解决方案异步工作,并以灵活的方式扩展

2017-07-30T16:36:15.607 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.609 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.610 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.614 | -1 | Camel Thread #2 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | Camel Thread #1 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | Camel Thread #3 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.615 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.616 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.616 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.617 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.618 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.618 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.619 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.620 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.620 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.621 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.622 | -1 | Camel Thread #4 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.622 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.623 | -1 | Camel Thread #5 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.623 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.624 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.624 | -1 | Camel Thread #6 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.625 | -1 | Camel Thread #7 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.625 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.626 | -1 | Camel Thread #8 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.626 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.627 | -1 | Camel Thread #9 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.627 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.628 | -1 | Camel Thread #10 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.629 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async

查看Wire-Tap EIP。概述seda://和wireTap://解耦之间的区别:使用seda可以完全解耦生产者和消费者,因为无论阻塞多少消费者线程,生产者都可以继续,直到队列满为止。使用wireTap,生产者线程不会被阻塞,直到所有消费者线程都忙。有时需要一个,有时需要另一个。当您尝试使用splitter时也会出现问题,例如,它会生成输入流。我的问题是:
2017-07-30T16:36:15.607 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.609 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.610 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.614 | -1 | Camel Thread #2 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | Camel Thread #1 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | Camel Thread #3 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.614 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.615 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.616 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.616 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.617 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.618 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.618 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.619 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.620 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.620 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.621 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.622 | -1 | Camel Thread #4 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.622 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.623 | -1 | Camel Thread #5 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.623 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.624 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.624 | -1 | Camel Thread #6 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.625 | -1 | Camel Thread #7 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.625 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.626 | -1 | Camel Thread #8 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.626 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.627 | -1 | Camel Thread #9 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.627 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async
2017-07-30T16:36:15.628 | -1 | Camel Thread #10 - step2-worker | INFO  |  ---  ---  --- route2 | route2 | - receive async
2017-07-30T16:36:15.629 | -1 | main | INFO  |  ---  ---  --- route3 | route3 | - send async