端点角色

从 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() (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 名称。