端点角色

从 4.2 版本开始,端点可以被分配到角色。 角色允许端点作为一个组启动和停止。 这在使用领导选举时特别有用,在这种情况下,当授予或撤销领导权时,可以分别启动或停止一组端点。 为此,框架在应用程序上下文中注册了一个名为 IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLERSmartLifecycleRoleController bean。 每当需要控制生命周期时,可以注入或 @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();
}

以下示例展示了如何在 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 分别发布 OnGrantedEventOnRevokedEvent 时),它会自动启动和停止其配置的 SmartLifecycle 对象。

当使用领导选举来启动和停止组件时,将 auto-startup XML 属性(autoStartup bean 属性)设置为 false 很重要,这样应用程序上下文就不会在上下文初始化期间启动组件。

从 4.3.8 版本开始,SmartLifecycleRoleController 提供了几个状态方法:

public Collection<String> getRoles() [id="CO1-1"]1

public boolean allEndpointsRunning(String role) [id="CO1-2"]2

public boolean noEndpointsRunning(String role) [id="CO1-3"]3

public Map<String, Boolean> getEndpointsRunningStatus(String role) [id="CO1-4"]4
 <1>  返回正在管理的角色的列表。
 <1>  如果角色中的所有端点都在运行,则返回 `true`。
 <1>  如果角色中的所有端点都没有运行,则返回 `true`。
 <1>  返回 `组件名称 : 运行状态` 的映射。
组件名称通常是 bean 名称。