Apache camel 寻找一种非阻塞方式来处理特定路由中的事件

Apache camel 寻找一种非阻塞方式来处理特定路由中的事件,apache-camel,rx-java,Apache Camel,Rx Java,我正在考虑将哪种技术用于以下用例: 该系统是事件驱动的 有一个流(除了错误处理外,大部分没有分叉) 流本身应该是同步的,但不是阻塞的 到目前为止,我有以下几种可能性: 纯java- 这使得代码不那么清晰,因为我必须将回调嵌套在彼此之间 所有的东西都要自己写 ApacheCamel-使用camel路由 i、 e: 从(URI) .transform(creatUserExpression)//准备发送给db的消息 .inOut(DB.URI)//发送到数据库 .transform(UserCrea

我正在考虑将哪种技术用于以下用例:

该系统是事件驱动的 有一个流(除了错误处理外,大部分没有分叉) 流本身应该是同步的,但不是阻塞的

到目前为止,我有以下几种可能性:

  • 纯java- 这使得代码不那么清晰,因为我必须将回调嵌套在彼此之间 所有的东西都要自己写
  • ApacheCamel-使用camel路由 i、 e:
  • 从(URI) .transform(creatUserExpression)//准备发送给db的消息 .inOut(DB.URI)//发送到数据库 .transform(UserCreatedExpression)//准备要发送到下一步的消息 .inout(OtherService.URI) .end(); 这看起来是一个不错的解决方案,但camel是否适合处理我的所有业务逻辑—事件的所有流? camel主要用于服务之间的集成,因此我们不确定将其用于业务逻辑是否正确

  • java RX-看起来是一个可能的选择,但仍然不太了解它,它是否已准备好生产? 目前的版本是0.20.7-还不是1.X版本

  • akka-尝试将其用于流-但为了确保流只向一个方向运行,我们需要使用FSM,这导致代码过于复杂,我们决定不使用它

  • 如有其他建议,将不胜感激


  • 我同意,在大多数情况下,您通常会尝试在集成路线中避开尽可能多的业务逻辑。ESB上的业务逻辑通常是一个很大的“不”,我所认识的一些更为严格的架构师在看到集成层中的业务逻辑时会破口大骂。当您使用ESB系统集成服务时,这种观点是有意义的

    在SOA/服务世界中,您不希望生产者和消费者紧密耦合,向集成层添加业务逻辑会破坏这种抽象。消费者应该能够使用SAP系统、C#web服务、Java服务或任何其他服务中的数据,而不知道生产者是如何工作的。它应该只了解数据

    ApacheCamel不是ESB,它是一个EIP工具包/框架。您也可以在客户端应用程序中使用ApacheCamel。这就是我真正喜欢骆驼的原因之一。这是我可以用来创建集成路由的库。它非常灵活,可以自己使用,而不需要全尺寸的服务器

    因此,在您的案例中,我认为使用ApacheCamel实现此目的没有问题。如果要安装ServiceMix、FuseESB或其他完整的ESB系统,那么整个安装过程将变得过于复杂

    我的建议(这只是一个建议)是,在这种情况下,在您的路线中使用业务逻辑并不是坏事,因为这实际上(从您的描述)不是关于集成,而是利用Camel的功能来创建和维护事件系统。记住,Camel没有运行时环境,所以您仍然需要在某个地方托管此路由。一个简单的运行时容器是ApacheKaraf。您可以使用这个OSGi内核来安装和运行路由。上次我检查Karaf项目的解压速度低于40MB,因此与其他一些运行时间相比,它的解压速度非常小


    例如,我以这种方式使用Camel为android客户端创建和托管服务。我想我的主要信息是,Camel可以被认为是一个专门从事集成的路由引擎或路由引擎生成器。Camel不是一个ESB,因此这里对业务逻辑的关注并不总是适用的。

    3。RxJava的1.0.0版本从上周开始发布。(并且已经在Netflix的SoundClound Android应用程序中使用,…)顺便说一句,如果你不能在Rx和/或Camel之间做出决定,RxJava Camel端点已经存在(我还没有研究过),我现在看到他们在maven repository中更改了名称-它现在在io.reactivex/RxJava下,而不是com.Netflix.RxJava»RxJava核心(仍然是0.20.7)感谢您的投入,我也觉得更多的是利用Camel的功能,它使代码更清晰,更易于维护 from(URI) .transform(creatUserExpression) //prepare msg to send to db .inOut(DB.URI) //send to db .transform(UserCreatedExpression) //prepare msg to send to next step .inout(OtherService.URI) .end();