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]); 
			} 
		} 
	} 

 

标签:zookeeper
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号