领导权事件处理
端点组可以根据领导权被授予或撤销而分别启动和停止。这在集群场景中非常有用,因为共享资源必须仅由单个实例使用。一个例子是文件入站通道适配器,它轮询一个共享目录。(参见 读取文件)。
要参与领导者选举,并在当选领导者、领导权被撤销或未能获取资源成为领导者时收到通知,应用程序需要在应用程序上下文中创建一个名为“领导者发起器
”的组件。通常,领导者发起器是一个 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 领导权事件处理。