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

领导事件处理

可以根据领导权的授予或撤销,分别启动和停止端点组。 这在集群场景中非常有用,其中共享资源必须由单个实例消费。 一个例子是轮询共享目录的文件入站通道适配器。 (参见 读取文件)。spring-doc.cadn.net.cn

要参与领导者选举,并在当选领导者、领导权被撤销或未能获取资源成为领导者时收到通知,应用程序需要在应用上下文中创建一个名为“领导者初始化器”的组件。通常,领导者发起者的值为 SmartLifecycle,因此它会在上下文启动时(可选地)启动,并在领导权变更时发布通知。您还可以通过将 publishFailedEvents 设置为 true(从版本 5 开始)来接收失败通知。0),用于在您希望在发生失败时采取特定操作的情况。按照约定,您应提供一个Candidate来接收回调。您也可以通过框架提供的 Context 对象撤销领导权。您的代码也可以监听 o.s.i.leader.event.AbstractLeaderEvent 个实例(OnGrantedEventOnRevokedEvent 的超类),并做出相应响应(例如,使用 SmartLifecycleRoleController)。事件包含对 Context 对象的引用。以下列表展示了 Context 接口的定义:spring-doc.cadn.net.cn

public interface Context {

	boolean isLeader();

	void yield();

	String getRole();

}

从 5.0.6 版本开始,上下文提供了对候选人角色的引用。spring-doc.cadn.net.cn

Spring Integration 提供了基于 LockRegistry 抽象的领导者发起者的基本实现。 要使用它,您需要将其创建为 Bean 实例,如下示例所示:spring-doc.cadn.net.cn

@Bean
public LockRegistryLeaderInitiator leaderInitiator(LockRegistry locks) {
    return new LockRegistryLeaderInitiator(locks);
}

如果锁注册中心实现正确,则任何时候最多只会有一个领导者。 如果锁注册中心还提供会在过期或被破坏时抛出异常(理想情况下为InterruptedException)的锁,那么无领导时期的持续时间可以缩短至锁实现中固有的延迟所允许的最短时间。 默认情况下,busyWaitMillis属性会引入一些额外的延迟,以防止在更常见的锁不完美的情况下出现 CPU 饥饿问题,此时只有当你再次尝试获取锁时才会发现其已过期。spring-doc.cadn.net.cn

有关使用 Zookeeper 的领导选举和事件的更多信息,请参见 Zookeeper 领导事件处理。 有关使用 Hazelcast 的领导选举和事件的更多信息,请参见 Hazelcast 领导事件处理spring-doc.cadn.net.cn