エンドポイントのロール

バージョン 4.2 から、エンドポイントをロールに割り当てることができます。ロールを使用すると、エンドポイントをグループとして開始および停止できます。これは、リーダーシップの選択を使用する場合に特に役立ちます。リーダーシップの選択では、リーダーシップが許可または取り消されたときにエンドポイントのセットをそれぞれ開始または停止できます。このために、フレームワークは SmartLifecycleRoleController Bean をアプリケーションコンテキストに IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLER という名前で登録します。ライフサイクルを制御する必要があるときはいつでも、この Bean を挿入するか @Autowired できます:

<bean class="com.some.project.SomeLifecycleControl">
    <property name="roleController" ref="integrationLifecycleRoleController"/>
</bean>

XML、Java 構成、プログラムを使用して、エンドポイントをロールに割り当てることができます。次の例は、XML を使用してエンドポイントロールを設定する方法を示しています。

<int:inbound-channel-adapter id="ica" channel="someChannel" expression="'foo'" role="cluster"
        auto-startup="false">
    <int:poller fixed-rate="60000" />
</int:inbound-channel-adapter>

次の例は、Java で作成された Bean のエンドポイントロールを構成する方法を示しています。

@Bean
@ServiceActivator(inputChannel = "sendAsyncChannel", autoStartup="false")
@Role("cluster")
public MessageHandler sendAsyncHandler() {
    return // some MessageHandler
}

次の例は、Java のメソッドでエンドポイントロールを構成する方法を示しています。

@Payload("#args[0].toLowerCase()")
@Role("cluster")
public String handle(String payload) {
    return payload.toUpperCase();
}

次の例は、Java で SmartLifecycleRoleController を使用してエンドポイントロールを設定する方法を示しています。

@Autowired
private SmartLifecycleRoleController roleController;
...
    this.roleController.addSmartLifeCycleToRole("cluster", someEndpoint);
...

次の例は、Java で IntegrationFlow を使用してエンドポイントロールを設定する方法を示しています。

IntegrationFlow flow -> flow
        .handle(..., e -> e.role("cluster"));

これらはそれぞれ、エンドポイントを cluster ロールに追加します。

roleController.startLifecyclesInRole("cluster") および対応する stop…​ メソッドを呼び出すと、エンドポイントが開始および停止します。

SmartLifecycle を実装するオブジェクトは、エンドポイントだけでなく、プログラムで追加できます。

SmartLifecycleRoleController は ApplicationListener<AbstractLeaderEvent> を実装し、リーダーシップが許可または取り消された場合(一部の Bean がそれぞれ OnGrantedEvent または OnRevokedEvent を発行した場合)、構成された SmartLifecycle オブジェクトを自動的に開始および停止します。

リーダーシップの選択を使用してコンポーネントを起動および停止する場合、auto-startup XML 属性(autoStartup Bean プロパティ)を false に設定して、コンテキストの初期化中にアプリケーションコンテキストがコンポーネントを起動しないようにすることが重要です。

バージョン 4.3.8 以降、SmartLifecycleRoleController はいくつかのステータスメソッドを提供します。

public Collection<String> getRoles() (1)

public boolean allEndpointsRunning(String role) (2)

public boolean noEndpointsRunning(String role) (3)

public Map<String, Boolean> getEndpointsRunningStatus(String role) (4)
1 管理されているロールのリストを返します。
2 ロール内のすべてのエンドポイントが実行されている場合、true を返します。
3 ロール内のエンドポイントがどれも実行されていない場合、true を返します。
4component name : running status のマップを返します。コンポーネント名は通常、Bean 名です。