跳到主要内容
版本:7.0.2

领导力事件处理

DeepSeek V3 中英对照 Leadership Event Handling

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

要参与领导者选举,并在当选领导者、领导权被撤销或未能获取成为领导者所需的资源时接收通知,应用程序需要在应用上下文中创建一个名为“领导者初始化器”的组件。通常,领导者初始化器是一个 SmartLifecycle,因此它(可选地)在上下文启动时开始运行,并在领导权变更时发布通知。从版本 5.0 开始,您还可以通过将 publishFailedEvents 设置为 true 来接收失败通知,以便在发生故障时采取特定操作。按照惯例,您应该提供一个接收回调的 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 领导事件处理