Red Hat Training

A Red Hat training course is available for Red Hat Fuse

166.5. 定義済みの式

Camel のバージョン 2.13.0 から、JGroups コンポーネントには、JGroupsExpressions. という名前の定義済み式ファクトリークラスが付属しています。

Camel コンテキストがまだ開始されていない場合にのみルートに影響を与える遅延を作成する場合は、JGroupsExpressions.delayIfContextNotStarted(long delay) ファクトリーメソッドを使用します。このファクトリーメソッドによって作成された式は、Camel コンテキストが started とは異なる状態にある場合にのみ、指定された遅延値を返します。この式は、クラスター内でシングルトン (マスター) ルートを維持するために JGroups コンポーネントを使用する場合に特に役立ちます。Camel コンテキストがまだ開始されていない場合、コントロールバスの開始 コマンドはシングルトンルートを初期化しません。そのため、Camel コンテキストの起動後にマスタールートが確実に初期化されるように、マスタールートの起動を遅らせる必要があります。このようなシナリオはクラスターの初期化中にのみ発生する可能性があるため、新しいマスターになるスレーブノードの起動を遅らせたくありません。そのため、条件付き遅延式が必要です。

以下のスニペットは、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);