终端角色
从 4.2 版本开始,端点可以分配给角色。角色允许端点作为一组进行启动和停止。这在使用领导选举时特别有用,当领导权被授予或撤销时,可以分别启动或停止一组端点。为此,框架在应用程序上下文中注册了一个名为 IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLER 的 SmartLifecycleRoleController bean。每当需要控制生命周期时,可以注入此 bean 或使用 @Autowired:
<bean class="com.some.project.SomeLifecycleControl">
    <property name="roleController" ref="integrationLifecycleRoleController"/>
</bean>
你可以使用 XML、Java 配置或以编程方式将端点分配给角色。以下示例展示了如何使用 XML 配置端点角色:
<endpoint id="myEndpoint">
    <roles>
        <role>admin</role>
        <role>user</role>
    </roles>
</endpoint>
以上XML配置示例定义了一个具有 admin 和 user 角色的端点。
<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>,它会在获得或撤销领导权时自动启动和停止其配置的 SmartLifecycle 对象(当某个 bean 发布 OnGrantedEvent 或 OnRevokedEvent 时,分别对应授予或撤销领导权)。
在使用领导选举来启动和停止组件时,设置 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
- 返回正在管理的角色列表。 
- 如果角色中的所有端点都在运行,则返回 - true。
- 如果角色中的所有端点都没有在运行,则返回 - true。
- 返回一个 - 组件名称 : 运行状态的映射。组件名称通常是 bean 名称。