Zookeeper 支持
4.2 版本在框架中添加了 Zookeeper 支持,其中包括:
您需要将此依赖项包含到您的项目中
-
Maven
-
Gradle
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-zookeeper</artifactId>
<version>6.3.5</version>
</dependency>
compile "org.springframework.integration:spring-integration-zookeeper:6.3.5"
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 的缓存。有关更多信息,请参阅其 JavaDoc。
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
实例的配置。只需要提供 candidate
或 role
选项之一,但不能同时提供两者;role
选项内部创建一个 DefaultCandidate
实例,其中 id
选项为 UUID
。