Zookeeper 支持

版本 4.2 在版本 4.2 中为框架添加了 Zookeeper 支持,其中包括

您需要将此依赖项包含到您的项目中

  • Maven

  • Gradle

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-zookeeper</artifactId>
    <version>6.3.0</version>
</dependency>
compile "org.springframework.integration:spring-integration-zookeeper:6.3.0"

Zookeeper 元数据存储

您可以在需要任何 MetadataStore 的地方使用 ZookeeperMetadataStore,例如用于持久文件列表过滤器。有关更多信息,请参见 元数据存储。以下示例使用 XML 配置 Zookeeper 元数据存储

<bean id="client" class="org.springframework.integration.zookeeper.config.CuratorFrameworkFactoryBean">
    <constructor-arg value="${connect.string}" />
</bean>

<bean id="meta" class="org.springframework.integration.zookeeper.metadata.ZookeeperMetadataStore">
    <constructor-arg ref="client" />
</bean>

以下示例展示了如何使用 Java 配置 Zookeeper 元数据存储

@Bean
public MetadataStore zkStore(CuratorFramework client) {
    return new ZookeeperMetadataStore(client);
}

Zookeeper 锁注册表

ZookeeperLockRegistry 可用于需要任何 LockRegistry 的地方,例如在使用聚合器时,在具有共享 MessageStore 的集群环境中。

LockRegistry 用于根据键“查找”锁(聚合器使用 correlationId)。默认情况下,ZookeeperLockRegistry 中的锁在 zookeeper 中以下路径下维护:/SpringIntegration-LockRegistry/。您可以通过提供 ZookeeperLockRegistry.KeyToPathStrategy 的实现来自定义路径,如下例所示

public interface KeyToPathStrategy {

    String pathFor(String key);

    boolean bounded();

}

如果策略从 isBounded 返回 true,则不需要收获未使用的锁。对于无界策略(例如默认策略),您需要定期调用 expireUnusedOlderThan(long age) 以从内存中删除旧的未使用锁。

从 5.5.6 版本开始,ZookeeperLockRegistry 支持通过 ZookeeperLockRegistry.setCacheCapacity() 自动清理 ZookeeperLockRegistry.locks 中的 ZkLock 缓存。有关更多信息,请参见其 JavaDocs。

Zookeeper 领导者事件处理

以下示例使用 XML 配置应用程序以在 Zookeeper 中进行领导者选举

<int-zk:leader-listener client="client" path="/siNamespace" role="cluster" />

client 是对 CuratorFramework bean 的引用。CuratorFrameworkFactoryBean 可用。当选举出领导者时,将为角色 cluster 发布 OnGrantedEvent。该角色中的任何端点都将启动。当领导者身份被撤销时,将为角色 cluster 发布 OnRevokedEvent。该角色中的任何端点都将停止。有关更多信息,请参见 端点角色

您可以使用 Java 配置来创建领导者启动器的实例,如下例所示

@Bean
public LeaderInitiatorFactoryBean leaderInitiator(CuratorFramework client) {
    return new LeaderInitiatorFactoryBean()
                .setClient(client)
                .setPath("/siTest/")
                .setRole("cluster");
}

从 5.3 版本开始,LeaderInitiatorFactoryBean 上公开了 candidate 选项,以便更好地控制外部提供的 Candidate 实例的配置。candidaterole 选项只需要提供一个,不能同时提供;role 选项在内部创建一个 DefaultCandidate 实例,并使用 UUID 作为 id 选项。