165.5. 事前定義された式
Camel バージョン 2 .13.0 以降、JGroups コンポーネントには JGroups Expressions という名前の事前定義された式ファクトリークラスが同梱されています。
Camel コンテキストがまだ開始されていない場合にのみルートに影響を与える遅延を作成する場合は、JGroupsExpressions.delayIfContextNotStarted(long delay)
ファクトリーメソッドを使用します。このファクトリーメソッドによって作成された式は、Camel コンテキストが 開始
したものとは異なる場合にのみ指定の遅延値を返します。この式は、クラスター内でシングルトン(マスター)ルートを維持するために JGroups コンポーネントを使用する場合に便利です。Control Bus start
コマンドは、Camel Context が起動していない場合はシングルトンルートを初期化しません。そのため、マスタールートの起動を遅延させ、Camel Context の起動後に初期化されていることを確認する必要があります。このようなシナリオはクラスターの初期化中にのみ発生する可能性があるので、スレーブノードの起動を新しいマスターに遅延させたくないので、条件的な遅延式が必要なからです。
以下のスニペットは、JGroups コンポーネントと条件遅延を使用して、クラスター内のマスターノードの初期起動を遅らせる方法を示しています。
import static java.util.concurrent.TimeUnit.SECONDS; import static org.apache.camel.component.jgroups.JGroupsExpressions.delayIfContextNotStarted; import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews; ... from("jgroups:clusterName?enableViewMessages=true"). filter(dropNonCoordinatorViews()). threads().delay(delayIfContextNotStarted(SECONDS.toMillis(5))). // run in separated and delayed thread. Delay only if the context hasn't been started already. to("controlbus:route?routeId=masterRoute&action=start&async=true"); from("timer://master?repeatCount=1").routeId("masterRoute").autoStartup(false).to(masterMockUri);