Apache Camel中“direct:”和to()之间有什么区别?

时间:2012-06-08 17:15:08

标签: apache-camel

DirectComponent documentation给出了以下示例:

from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("direct:processOrder");

from("direct:processOrder")
    .to("bean:orderService?method=process")
    .to("activemq:queue:order.out");

它和以下之间有什么区别吗?

from("activemq:queue:order.in")
    .to("bean:orderServer?method=validate")
    .to("bean:orderService?method=process")
    .to("activemq:queue:order.out");

我试图找到关于to()方法在Java DSL上的行为的文档,但超出了RouteDefinition javadoc(它给出了非常简单的“将交换发送到给定端点”)我空白了:(

5 个答案:

答案 0 :(得分:16)

在上面的例子中,你不会发现太大的区别。 “直接”组件非常类似于方法调用。

一旦开始构建一些更复杂的路线,您将需要将它们分成几个不同的部分,原因有多种。

例如,您可以创建可以在Camel上下文中的多个路由之间重用的“子路由”。就像你在常规编程中细分方法一样,以允许可重用​​性并使代码更清晰。对于使用例如直接分量的子路由也是如此。

可以延长相同的方法。假设您希望将多个协议用作路由的端点。您可以使用直接端点来创建主路径,如下所示:

// Three endpoints to one "main" route.
from("activemq:queue:order.in")
  .to("direct:processOrder");

from("file:some/file/path")
  .to("direct:processOrder");

from("jetty:http://0.0.0.0/order/in")
  .to("direct:processOrder");

from("direct:processOrder")
  .to("bean:orderService?method=process")
  .to("activemq:queue:order.out");

另一件事是为DSL中的每个“from()”子句创建一个路由。路由是Camel中的工件,您可以使用Camel API对其执行某些管理任务,例如动态启动,停止,添加和删除路由。 “to”子句只是一个端点调用。

一旦开始做一些在Camel中有些复杂的真实案例,你会注意到你不能得到太多的“直接”路线。

答案 1 :(得分:2)

Direct Component用于命名路由的逻辑段。这与结构编程中的命名过程类似。

在您的示例中,消息流没有区别。在结构编程方面,我们可以说你为你的路线做了一种inline expansion

答案 2 :(得分:1)

另一个区别是Direct组件没有任何线程池,直接使用者进程方法由直接生产者的调用线程调用。

答案 3 :(得分:0)

 from(A).to(B).to(OUT) 

正在链接

A --- B --- OUT

但是

from(A ).to( X)
from(B ).to( X)
       from( X).to( OUT )

其中X是直接的:?

基本上就像一个连接

A
  \____ OUT
  /
B

显然这些是不同的行为,第二个你可以实现你想要的任何逻辑,而不仅仅是一个串行链

答案 4 :(得分:0)

主要用于破解复杂的路由配置,就像在java中我们曾经有过可重用性的方法一样。而且通过在直接路由上配置线程,我们可以减少调用线程的工作。