Zookeeper Support

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

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

  • Maven

  • Gradle

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

Zookeeper Metadata Store

您可以在需要任何 MetadataStore 的任何地方使用 ZookeeperMetadataStore,例如持久文件列表过滤器。有关更多信息,请参阅 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 Lock Registry

可以在任何需要 LockRegistry 的地方使用 ZookeeperLockRegistry,例如在群集环境中使用聚合器和共享 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 Leadership Event Handling

以下示例使用 XML 为 Zookeeper 中的领导选举配置应用程序:

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

client 用于引用 CuratorFramework bean。CuratorFrameworkFactoryBean 是可用的。当选出领导者时,将为角色 cluster 发布 OnGrantedEvent。该角色中的所有端点都将启动。当取消领导地位时,将为角色 cluster 发布 OnRevokedEvent。该角色中的所有端点都将停止。有关更多信息,请参阅 Endpoint Roles

您可以使用 Java 配置创建リーダー发起者实例,如下例所示:

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

从版本 5.3 开始,candidate 选项显示在 LeaderInitiatorFactoryBean 上,用于更精细地配置外部提供的 Candidate 实例。只能提供 candidaterole 选项之一,但不能同时提供;role 选项使用 UUID 创建内部 DefaultCandidate 实例,用作 id 选项。