14

DirectComponent 文档提供了以下示例:

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(它给出了非常简短的“将交换发送到给定端点”)我已经空白了:(

4

5 回答 5

18

在上述情况下,您不会注意到太大的差异。“直接”组件很像方法调用。

一旦开始构建更复杂的路线,出于多种原因,您将希望将它们分成几个不同的部分。

例如,您可以创建可以在 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 中做一些有些复杂的真实案例,你会注意到你不能得到太多的“直接”路由。

于 2012-06-08T22:34:29.007 回答
2

直接组件用于命名路由的逻辑段。这与结构化编程中的命名过程类似。

在您的示例中,消息流没有区别。在结构化编程方面,我们可以说您对您的路线进行了一种内联扩展。

于 2012-06-13T13:07:34.613 回答
1

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

于 2014-03-04T07:09:05.043 回答
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

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

于 2013-03-08T14:15:04.683 回答
0

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

于 2015-07-20T03:35:06.843 回答