1 import org.apache.curator.RetryPolicy;
2 import org.apache.curator.framework.CuratorFramework;
3 import org.apache.curator.framework.CuratorFrameworkFactory;
4 import org.apache.curator.framework.imps.CuratorFrameworkState;
5 import org.apache.curator.retry.ExponentialBackoffRetry;
6 import org.slf4j.Logger;
7 import org.slf4j.LoggerFactory;
8
9 import java.io.Closeable;
10 import java.io.IOException;
11
12 /**
13 * zookeeper连接持有者
14 *
15 * @author
16 * @version V1.0
17 * @modify by user: $author$ $date$
18 * @modify by reason:{方法名}:{原因}
19 */
20 public class ZookeeperHolder implements Closeable {
21 // /日志
22 private static final Logger LOG = LoggerFactory.getLogger(ZookeeperHolder.class);
23 // zk超时时间
24 private static final int SESSION_TIME = 30 * 1000;
25 //出错尝试次数
26 private static final int RETRY_TIMES = 3;
27 private CuratorFramework client;
28 private String zkUrl = null;
29
30 public ZookeeperHolder(String zkUrl) {
31 this.zkUrl = zkUrl;
32 client = initClient(zkUrl);
33 }
34
35 public CuratorFramework getClient() {
36 if (client == null) {
37 client = initClient(zkUrl);
38 }else if (!client.getState().equals(CuratorFrameworkState.STARTED)) {
39 client.start();
40 }
41 return client;
42 }
43
44 /**
45 * 初始化客户端
46 *
47 * @param zkUrl
48 * @return
49 */
50 private CuratorFramework initClient(String zkUrl) {
51 LOG.info("初始化Zookeeper连接...");
52 try {
53 RetryPolicy retryPolicy = new ExponentialBackoffRetry(SESSION_TIME, RETRY_TIMES);
54 CuratorFramework client = CuratorFrameworkFactory.newClient(zkUrl, retryPolicy);
55 client.start();
56 return client;
57 } catch (Throwable e) {
58 LOG.error("Init zk client error with url [{}]", zkUrl, e);
59 throw e;
60 }
61 }
62
63 @Override
64 protected void finalize() throws Throwable {
65 if (client != null) {
66 client.close();
67 }
68 super.finalize();
69 }
70
71 @Override
72 public void close() throws IOException {
73 if (client != null) {
74 client.close();
75 }
76 }
77 }