# Zookeeper 支持

# Zookeeper 支持

版本 4.2 在版本 4.2 的框架中增加了Zookeeper (opens new window)支持,该支持包括:

你需要在项目中包含此依赖项:

Maven

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-zookeeper</artifactId>
    <version>5.5.9</version>
</dependency>

Gradle

compile "org.springframework.integration:spring-integration-zookeeper:5.5.9"

# ZooKeeper 元数据存储

你可以在需要ZookeeperMetadataStore的地方使用MetadataStore,例如用于持久性文件列表过滤器。有关更多信息,请参见元数据存储。以下示例使用 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的集群环境中使用聚合器时。

aLockRegistry用于“查找”基于密钥的锁(聚合器使用correlationId)。默认情况下,在 ZooKeeper 中,ZookeeperLockRegistry中的锁是在以下路径下维护的:/SpringIntegration-LockRegistry/。你可以通过提供ZookeeperLockRegistry.KeyToPathStrategy的实现来定制路径,如下例所示:

public interface KeyToPathStrategy {

    String pathFor(String key);

    boolean bounded();

}

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

使用 5.5.6 版本的字符串,ZookeeperLockRegistry支持在ZookeeperLockRegistry.locks中通过ZookeeperLockRegistry.setCacheCapacity()自动清理 zklock 的缓存。有关更多信息,请参见其 Javadocs。

# Zookeeper 领导力事件处理

下面的示例使用 XML 来配置 ZooKeeper 中的领导者选举应用程序:

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

client是对CuratorFramework Bean 的引用。aCuratorFrameworkFactoryBean可用。当一位领导人当选时,OnGrantedEvent的作用clusterOnGrantedEvent将被发布。该角色中的任何端点都会启动。当领导权被撤销时,OnRevokedEvent将发布该角色的cluster。该角色中的任何端点都将被停止。有关更多信息,请参见端点角色

你可以使用 Java 配置来创建 Leader Initiator 的实例,如下例所示:

@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选项。