端點角色

從 4.2 版本開始,端點可以被分配到角色。角色允許端點作為一個組啟動和停止。這在使用領導選舉時特別有用,當授予或撤銷領導權時,可以相應地啟動或停止一組端點。為此,框架會在應用程式上下文中註冊一個 SmartLifecycleRoleController bean,其名稱為 IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLER。無論何時需要控制生命週期,都可以注入或 @Autowired 此 bean。

<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();
}

以下示例展示瞭如何使用 SmartLifecycleRoleController 在 Java 中配置端點角色:

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

以下示例展示瞭如何使用 IntegrationFlow 在 Java 中配置端點角色:

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

這些都將端點新增到 cluster 角色。

呼叫 roleController.startLifecyclesInRole("cluster") 和相應的 stop…​ 方法將啟動和停止端點。

任何實現了 SmartLifecycle 的物件都可以透過程式設計方式新增——不僅僅是端點。

SmartLifecycleRoleController 實現了 ApplicationListener<AbstractLeaderEvent>,當領導權被授予或撤銷時(當某個 bean 分別釋出 OnGrantedEventOnRevokedEvent 時),它會自動啟動和停止其配置的 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
4 返回一個 元件名稱 : 執行狀態 的對映。元件名稱通常是 bean 名稱。