zookeeper 客户端提示:instance must be started before calling this method
虾米姐
阅读:1063
2021-03-31 16:54:51
评论:0
今天开始使用Curator ZooKeeper开源客户端。由于ZooKeeper原生的客户端比较低层,而且使用起来不方便,Netflix公司对ZooKeeper客户端API进行了封闭,提供一可以替代原生ZooKeeper客户端的框架——Curator,刚学习Curator,正尝试使用Curator编写znode节点的增、删、改、查,真是万事开头难,执行实例时就报错:java.lang.IllegalStateException: instance must be started before calling this method。
解决思路:
1、使用CuratorFramework的工厂函数生成客户端;
2、在操作ZK之前,记得先对客户端执行start(),启动客户端实例;
3、在操作ZK完成后,关闭客户端——close()。
核心代码:
public FileComponent(String zkServers, String root) {
this.root = root;
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
zkClient = CuratorFrameworkFactory.builder()
.connectString(zkServers)
.sessionTimeoutMs(5000)
.connectionTimeoutMs(5000)
.retryPolicy(retryPolicy)
.namespace(root)
.build();
try {
init();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 初始数据方法
@SuppressWarnings({ "resource", "unused" })
public void init() throws Exception {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xml);
String[] names = applicationContext.getBeanDefinitionNames();
int totalSize = names.length;
int pageSize = 2;
pageCount = (totalSize + pageSize - 1) / pageSize;
for (int i = 0; i < pageCount; i = i + 2) {
// 创建根节点的临时节点
if(zkClient.getState() != CuratorFrameworkState.STARTED){
zkClient.start();
}
zkClient.create().withMode(CreateMode.EPHEMERAL).forPath("/" + names[i + 1], names[i].getBytes());
// 内存临时缓存
if (!list.contains(names[i + 1])) {
list.add(names[i + 1]);
}
}
}
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。