领导事件处理

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

要参与领导者选举并获得当选领导者、领导权被撤销或无法获取资源成为领导者时的通知,应用程序会在应用程序上下文中创建一个名为“领导者发起者”的组件。通常,领导者发起者是 SmartLifecycle,因此它在上下文启动时(可选)启动,然后在领导权发生变化时发布通知。您还可以通过将 publishFailedEvents 设置为 true(从版本 5.0 开始)接收失败通知,以防万一您希望在发生故障时采取特定操作。按照惯例,您应该提供一个接收回调的 Candidate。您还可以通过框架提供的 Context 对象撤销领导权。您的代码还可以侦听 o.s.i.leader.event.AbstractLeaderEvent 实例(OnGrantedEventOnRevokedEvent 的超类)并做出相应的响应(例如,通过使用 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 领导者事件处理