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