すべてのルートにend()を使用することがベストプラクティスですか?
次の作品:
from("jms:some-queue")
.beanRef("bean1", "method1")
.beanRef("bean2", "method2")
これもそうです、
from("jms:some-queue")
.beanRef("bean1", "method1")
.beanRef("bean2", "method2")
.end()
いいえ!キャメルルートを「終了」するためにend()
を呼び出すベストプラクティスではありませんそして機能上の利点はありません。
to()
、bean()
、log()
などの一般的なProcessorDefinition関数の場合、これは単にendParent()メソッドの呼び出しにつながります。これはCamelソースからわかります。コード、ほとんど何もしません:
public ProcessorDefinition<?> endParent() { return this; }
End()の呼び出しは、独自のブロックを開始し、最も目立つようにTryDefinitions
aka doTry()
およびChoiceDefinitions
aka choice()
だけでなく、split(), loadBalance(), onCompletion()
やrecipientList()
などのよく知られた関数もあります。
動作中の特定のルートを終了する場合は、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に関連する操作が完了し、元のロートで操作を再開していることを示すために、終了する必要があります。
Javaの代わりにXMLDSLを使用している場合、これはより明確で理解しやすくなります。これでは、終了タグを使用する必要がないためです。 XMLの終了タグは、end()の記述を処理します。以下は、XMLDSLで記述されたまったく同じ例です。
<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"/>