1,258
社区成员
发帖
与我相关
我的任务
分享
import org.apache.zookeeper.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* Created by Link on 2016/9/14.
* 分布式自增id生成器
*
* 基于Zookeeper序列递增特性产生分布式环境下全局唯一的递增id
*/
public class DistributedIncreaseIDGen implements Watcher {
final private static Logger log = LoggerFactory.getLogger(DistributedIncreaseIDGen.class);
private CountDownLatch connectedSemaphore = new CountDownLatch( 1 );
private String prefix;
private ZooKeeper zk;
/**
* 构造函数
* @param zkHosts zk节点列表
* @param appPrefix znode前缀
*/
public DistributedIncreaseIDGen(String zkHosts,String appPrefix) {
prefix = appPrefix;
for(int i = 0 ; i < 10 ; i++)
ZookeeperUtil.pathChk(zkHosts,prefix);
try {
zk = new ZooKeeper(zkHosts,2000,this);
} catch (IOException e) {
log.error(e.getLocalizedMessage());
}
try {
connectedSemaphore.await();
} catch (InterruptedException e) {
log.error(e.getLocalizedMessage());
}
}
public String getPrefix() {
return prefix;
}
public long getNextID() {
try {
String path = zk.create(prefix + "/id-", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
String paths[] = path.split("-");
String num = paths[paths.length-1];
long numL = Long.parseLong(num);
zk.delete(path,-1);
return numL;
} catch (KeeperException | InterruptedException e) {
log.error(e.getLocalizedMessage());
}
return -1;
}
@Override
public void process(WatchedEvent event) {
Event.EventType type = event.getType();
Event.KeeperState state = event.getState();
String path = event.getPath();
if ( Event.KeeperState.SyncConnected == state ) {
connectedSemaphore.countDown();
}
}
}
ZookeeperUtil:
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
/**
* Created by Link on 2016/9/13.
*/
public abstract class ZookeeperUtil {
/**
* zk路径检查,如果不存在,创建数据为空的路径
* @param zks zk集群
* @param path 路径
*/
public static void pathChk(String zks,String path) {
pathChk(zks,path,new byte[0]);
}
public synchronized static void pathChk(String zks,String path,byte data[]) {
ZooKeeper zk = null;
try {
zk = new ZooKeeper(zks,2000, event -> {});
String[] paths = path.split("/");
paths = ArrayUtils.subarray(paths,1,paths.length);
for(int i = 0 ;i < path.length() ;i++) {
String thisPath = "/" + StringUtils.join(ArrayUtils.subarray(paths,0,i+1),"/");
if(zk.exists(thisPath,false)==null) {
zk.create(thisPath,data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
// Stat exists = zk.exists(path, false);
//
// if(exists==null) {
// zk.create(path,ByteArrayUtil.toByte(0L), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
// }
} catch (KeeperException | InterruptedException | IOException e) {
e.printStackTrace();
}
}
}