领导力事件处理

可以根据领导权的授予或撤销来启动和停止端点组。这在集群场景中很有用,在集群场景中,共享资源必须由单个实例使用。一个例子是轮询共享目录的文件入站通道适配器。(参见 读取文件)。

为了参与领导选举并接收当选领导、领导权被撤销或无法获取成为领导所需资源时的通知,应用程序会在应用程序上下文中创建一个名为“领导启动器”的组件。通常,领导启动器是一个 `SmartLifecycle`,因此它会在上下文启动时(可选)启动,并在领导权发生变化时发布通知。您还可以通过将 `publishFailedEvents` 设置为 `true`(从版本 5.0 开始)来接收失败通知,以便在发生故障时采取特定操作。按照惯例,您应该提供一个接收回调的 `Candidate`。您也可以通过框架提供的 `Context` 对象撤销领导权。您的代码还可以监听 `o.s.i.leader.event.AbstractLeaderEvent` 实例(`OnGrantedEvent` 和 `OnRevokedEvent` 的超类)并做出相应的响应(例如,使用 `SmartLifecycleRoleController`)。这些事件包含对 `Context` 对象的引用。以下清单显示了 `Context` 接口的定义

public interface Context {

	boolean isLeader();

	void yield();

	String getRole();

}

从版本 5.0.6 开始,上下文提供对候选人角色的引用。

Spring Integration 提供了一个基于 `LockRegistry` 抽象的领导启动器基本实现。要使用它,您需要创建一个实例作为 bean,如下例所示

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

如果锁注册表正确实现,则最多只有一个领导。如果锁注册表还提供在过期或断开时抛出异常(理想情况下为 `InterruptedException`)的锁,则无领导期的持续时间可以与锁实现中固有的延迟一样短。默认情况下,`busyWaitMillis` 属性会添加一些额外的延迟,以防止在锁不完美(更常见的情况)时发生 CPU 饥饿,您只有在再次尝试获取锁时才知道它们已过期。

有关使用 Zookeeper 进行领导选举和事件处理的更多信息,请参阅 Zookeeper 领导事件处理。有关使用 Hazelcast 进行领导选举和事件处理的更多信息,请参阅 Hazelcast 领导事件处理