领导事件处理

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

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

© . This site is unofficial and not affiliated with VMware.