zookeeper生成序列号2种方式
发布时间:2020-12-15 03:20:10 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 依赖zookeeper服务生成分布式一致的序列号两种方式 package zk.seq;import com.github.zkclient.IZkChildListener;import com.github.zkclient.ZkClie
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 依赖zookeeper服务生成分布式一致的序列号两种方式 package zk.seq; import com.github.zkclient.IZkChildListener; import com.github.zkclient.ZkClient; import org.apache.zookeeper.data.Stat; import java.util.Arrays; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * Author : secondriver */ public class GenerateSeq { //提前创建好存储Seq的"/createSeq"结点 CreateMode.PERSISTENT public static final String SEQ_ZNODE = "/seq"; //提前创建好锁对象的结点"/lock" CreateMode.PERSISTENT public static final String LOCK_ZNODE = "/lock"; public static void main(String[] args) { final ExecutorService service = Executors.newFixedThreadPool(20); for (int i = 0; i < 20; i++) { service.execute(new Task2("[Concurrent-" + i + "]")); } if (!service.isShutdown()) { try { service.shutdown(); if (!service.awaitTermination(10,TimeUnit.SECONDS)) { service.shutdownNow(); } } catch (InterruptedException e) { service.shutdownNow(); System.out.println(e.getMessage()); } } } public static class Task1 implements Runnable { private final String taskName; public Task1(String taskName) { this.taskName = taskName; } @Override public void run() { ZkClient zkClient = new ZkClient("192.168.88.153:2181",3000,1000); Stat stat = zkClient.writeData(SEQ_ZNODE,new byte[0],-1); int versionAsSeq = stat.getVersion(); //versionAsSeq 最终的序列号 System.out.println(taskName + " obtain seq=" + versionAsSeq); zkClient.close(); } } //分布式锁实现 public static class Task2 implements Runnable,IZkChildListener { private final String taskName; private final ZkClient zkClient; private final String lockPrefix = "/loc"; private final String selfZnode; public Task2(String taskName) { this.taskName = taskName; zkClient = new ZkClient("192.168.88.153:2181",30000,10000); selfZnode = zkClient.createEphemeralSequential(LOCK_ZNODE + lockPrefix,new byte[0]); } @Override public void run() { zkClient.subscribeChildChanges(LOCK_ZNODE,this); do { } while (zkClient.isConnected()); } private void createSeq() { Stat stat = new Stat(); byte[] oldData = zkClient.readData(LOCK_ZNODE,stat); byte[] newData = update(oldData); zkClient.writeData(LOCK_ZNODE,newData); //new String(newData) 最终的序列号 System.out.println(taskName + selfZnode + " obtain seq=" + new String(newData)); } private byte[] update(byte[] currentData) { String s = new String(currentData); int d = Integer.parseInt(s); d = d + 1; s = String.valueOf(d); return s.getBytes(); } @Override public void handleChildChange(String parentPath,List<String> currentChildren) throws Exception { String[] childrensZnode = currentChildren.toArray(new String[currentChildren.size()]); Arrays.sort(childrensZnode); String minZnode = LOCK_ZNODE + "/" + childrensZnode[0]; if (selfZnode.equals(minZnode)) { createSeq(); zkClient.unsubscribeChildChanges(LOCK_ZNODE,this); zkClient.delete(selfZnode); zkClient.close(); } } } } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |