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(它给出了非常简单的“将交换发送到给定端点”)我空白了:(
答案 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中我们曾经有过可重用性的方法一样。而且通过在直接路由上配置线程,我们可以减少调用线程的工作。