"direct:"和to()在Apache Camel中有什么区别?

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");

我试图找到关于Java DSL中to()方法行为的文档,但除了RouteDefinition javadoc(其中只简单地列出“将交换发送到给定的终端点”)之外,我一无所获:(

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中处理一些较为复杂的真实案例,您会注意到您不能拥有太多的“direct”路由。


好的。我理解这是可重用性/身份的一个点;那么是否存在行为差异呢? - bacar
“to”子句只是一个终端调用。这句话确切地意味着什么?听起来有点模糊。 - bacar
to子句将执行你在问题中所说的操作。发送交换到组件的端点,其中交换是消息信封,而端点是组件的某个配置。to() 的行为在很大程度上取决于组件(http://camel.apache.org/components)。 - Petter Nordlander
我还是不明白。我在那个链接中找不到任何暗示 to() 方法的行为取决于组件的内容。 - bacar
我现在接受这个答案,但我很确定我有一个情况,取决于你是直接使用.to还是通过“direct:”进行的,当它跨越分裂/聚合时表现不同 - 如果我能复制这个问题,我会发布它。 - bacar
它最终调用代表from和to的Consumer和Producer上的方法,并且往往为每个消费者单独实现。 - user1743310

2

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

在您的示例中,消息流程没有任何区别。从结构化编程的角度来看,我们可以说您对路由进行了一种内联扩展


有类似的例子,其中确实存在差异吗? - bacar
基本上这就是区别 :) 直接的 == 逻辑名称 - Henryk Konsek
我的意思是观察到的行为。听起来像是不行。 - bacar
是的,您可以假设运行时行为没有任何差异。 - Henryk Konsek

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

0

主要用于打破复杂的路由配置,就像在Java中我们使用方法来实现可重用性一样。并且通过在直接路由上配置线程,我们可以减少调用线程的工作。


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

显然这些是不同的行为,而使用第二种方法,您可以实现任何逻辑,而不仅仅是串行链。


如何使用from(direct)开始路由,然后读取文件? - MRK187
从(文件).到(直接)你的问题有点含糊,所以我猜测一下你的意思。如果你更明确地重复一遍,我可以更精确地告诉你。如果你的意思是像触发器一样,请尝试“pollenrich()”——我认为它的文档记录得不是很好,但它就像一个触发器。从(直接:A).pollenrich(B) - user1743310

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接