# 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
的作用cluster
的OnGrantedEvent
将被发布。该角色中的任何端点都会启动。当领导权被撤销时,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
实例的更多配置控制。只需要提供一个candidate
或role
选项,但不能同时提供这两个选项;role
选项在内部创建一个DefaultCandidate
实例,其中UUID
用于id
选项。