终端节点角色

从版本 4.2 开始,可以将终端节点分配给角色。 角色允许将终端节点作为一个组来启动和停止。 这在使用 leadership election 时特别有用,其中可以分别在授予或撤销 leadership 时启动或停止一组端点。 为此,框架注册了一个SmartLifecycleRoleControllerbean 中的名称为IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLER. 每当需要控制生命周期时,都可以注入这个 bean 或@Autowired:spring-doc.cadn.net.cn

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

您可以使用 XML、Java 配置或以编程方式将终端节点分配给角色。 以下示例演示如何使用 XML 配置终结点角色:spring-doc.cadn.net.cn

<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 配置端点角色:spring-doc.cadn.net.cn

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

以下示例演示如何在 Java 中的方法上配置终结点角色:spring-doc.cadn.net.cn

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

以下示例显示如何使用SmartLifecycleRoleController在 Java 中:spring-doc.cadn.net.cn

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

以下示例演示如何使用IntegrationFlow在 Java 中:spring-doc.cadn.net.cn

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

每个作都会将终端节点添加到cluster角色。spring-doc.cadn.net.cn

调用roleController.startLifecyclesInRole("cluster")和相应的stop…​method 启动和停止端点。spring-doc.cadn.net.cn

实现SmartLifecycle可以通过编程方式添加 — 而不仅仅是 endpoints。

SmartLifecycleRoleController实现ApplicationListener<AbstractLeaderEvent>它会自动启动和停止其配置的SmartLifecycle对象(当某些 bean 发布OnGrantedEventOnRevokedEvent)。spring-doc.cadn.net.cn

使用 leadership election 启动和停止组件时,请务必设置auto-startupXML 属性 (autoStartupBean 属性)设置为false,以便应用程序上下文不会在上下文初始化期间启动组件。

从版本 4.3.8 开始,SmartLifecycleRoleController提供了几种状态方法:spring-doc.cadn.net.cn

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 返回component name : running status. 组件名称通常是 bean 名称。