如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

端点角色

从版本 4.2 开始,端点可以分配给角色。 角色允许将端点作为一个组进行启动和停止。 这在领导权选举场景中特别有用,当获得或撤销领导权时,可以分别启动或停止一组端点。 为此,框架会在应用程序上下文中注册一个名称为 IntegrationContextUtils.INTEGRATION_LIFECYCLE_ROLE_CONTROLLERSmartLifecycleRoleController Bean。 每当需要控制生命周期时,可以注入该 Bean 或使用 @Autowiredspring-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();
}

以下示例展示了如何在 Java 中使用 SmartLifecycleRoleController 配置端点角色:spring-doc.cadn.net.cn

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

以下示例展示了如何在 Java 中使用 IntegrationFlow 来配置端点角色:spring-doc.cadn.net.cn

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

这些操作都会将端点添加到 cluster 角色中。spring-doc.cadn.net.cn

调用 roleController.startLifecyclesInRole("cluster") 及其对应的 stop…​ 方法可启动和停止端点。spring-doc.cadn.net.cn

任何实现了 SmartLifecycle 的对象都可以以编程方式添加——而不仅仅是端点。

The SmartLifecycleRoleController 实现了 ApplicationListener<AbstractLeaderEvent>,并在获得或失去领导权时自动启动和停止其配置的 SmartLifecycle 对象(当某个 Bean 发布 OnGrantedEventOnRevokedEvent 时)。spring-doc.cadn.net.cn

当使用领导权选举来启动和停止组件时,重要的是将 auto-startup XML 属性(autoStartup bean 属性)设置为 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 名称。