跳到主要内容

领导力事件处理

QWen Plus 中英对照 Leadership Event Handling

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

要参与领导者选举并在当选领导者、领导权被撤销或未能获取成为领导者的资源时收到通知,应用程序会在应用程序上下文中创建一个名为“领导者发起者”的组件。通常,领导者发起者是一个 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();

}
java

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

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

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

如果锁注册表实现正确,则最多只有一个领导者。如果锁注册表还提供了在锁过期或被破坏时抛出异常(理想情况下是 InterruptedException)的锁,则无领导者时期的持续时间可以尽可能短,仅受锁实现固有延迟的限制。默认情况下,busyWaitMillis 属性增加了一些额外的延迟,以防止 CPU 在锁不完美(更常见的情况)的情况下出现饥饿现象,而你只有在再次尝试获取锁时才知道它们已经过期。

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