骆驼 - 使用 end()

Posted

技术标签:

【中文标题】骆驼 - 使用 end()【英文标题】:Camel - using end() 【发布时间】:2016-02-21 10:11:12 【问题描述】:

对每条路由都使用 end() 是最佳做法吗?

以下作品:

from("jms:some-queue")      
    .beanRef("bean1", "method1")
    .beanRef("bean2", "method2")

原来如此,

from("jms:some-queue")      
    .beanRef("bean1", "method1")
    .beanRef("bean2", "method2")
    .end()

【问题讨论】:

【参考方案1】:

不!调用end()“结束”骆驼路线不是最佳做法,不会产生任何功能优势。

对于常见的 ProcessorDefinition 函数,如 to()bean()log(),它只会调用 endParent() 方法,正如从 Camel 源代码中可以看到的那样,它的作用很小:

public ProcessorDefinition<?> endParent() return this;

调用 end() 是必需的,一旦你调用了启动它们自己的块的处理器定义,最显着包括 TryDefinitions aka doTry()ChoiceDefinitions aka choice(),但也众所周知的函数,如 @ 987654331@或recipientList()

【讨论】:

嗨,是否有一些解释 end() 方法的文档?谢谢 嗨,我没有找到关于end()方法的官方文档,但我认为以下链接足以验证答案:camel users: question about end()【参考方案2】:

当你想结束正在运行的特定路线时,你必须使用 end()。可以在 onCompletion 的例子中得到最好的解释

from("direct:start")
.onCompletion()
    // this route is only invoked when the original route is complete as a kind
    // of completion callback
    .to("log:sync")
    .to("mock:sync")
// must use end to denote the end of the onCompletion route
.end()
// here the original route contiues
.process(new MyProcessor())
.to("mock:result");

此处必须结束,表示与 onCompletion 相关的操作已完成,并且您正在恢复原始死记硬背上的操作。

如果您使用 XML DSL 而不是 java,这将变得更加清晰易懂。因为在此您不必使用结束标签。 XML 的结束标记将负责编写 end()。下面是用 XML DSL 编写的完全相同的示例

<route>
<from uri="direct:start"/>
<!-- this onCompletion block will only be executed when the exchange is done being routed -->
<!-- this callback is always triggered even if the exchange failed -->
<onCompletion>
    <!-- so this is a kinda like an after completion callback -->
    <to uri="log:sync"/>
    <to uri="mock:sync"/>
</onCompletion>
<process ref="myProcessor"/>
<to uri="mock:result"/>

【讨论】:

谢谢,我知道在某些情况下我们必须使用 end() (否则它甚至可能导致编译错误)。我的疑问是,在我在问题中提到的情况下,这有什么不同吗?

以上是关于骆驼 - 使用 end()的主要内容,如果未能解决你的问题,请参考以下文章

使用ftl进行骆驼休息响应

将 Jackson JSON 库与骆驼一起使用时出现异常

骆驼使用xpath检索xml标签名称

我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

如何使用 Spring DSL 在骆驼中记录标头值

如何使骆驼简单表达式与spring xml中的属性占位符一起使用