# Zookeeper 支持

## Zookeeper 支持

版本 4.2 在版本 4.2 的框架中增加了[Zookeeper](https://zookeeper.apache.org/)支持，该支持包括：

* [元数据存储](#zk-metadata-store)

* [锁定注册中心](#zk-lock-registry)

* [领导事件处理](#zk-leadership)

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

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`，例如用于持久性文件列表过滤器。有关更多信息，请参见[元数据存储](./meta-data-store.html#metadata-store)。以下示例使用 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`的集群环境中使用聚合器时。

a`LockRegistry`用于“查找”基于密钥的锁（聚合器使用`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 的引用。a`CuratorFrameworkFactoryBean`可用。当一位领导人当选时，`OnGrantedEvent`的作用`cluster`的`OnGrantedEvent`将被发布。该角色中的任何端点都会启动。当领导权被撤销时，`OnRevokedEvent`将发布该角色的`cluster`。该角色中的任何端点都将被停止。有关更多信息，请参见[端点角色](./endpoint.html#endpoint-roles)。

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

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

从版本 5.3 开始，将在`LeaderInitiatorFactoryBean`上公开一个`candidate`选项，以获得外部提供的`Candidate`实例的更多配置控制。只需要提供一个`candidate`或`role`选项，但不能同时提供这两个选项；`role`选项在内部创建一个`DefaultCandidate`实例，其中`UUID`用于`id`选项。