curator分布式序号生成器
2017-09-17 22:42
190 查看
1、前提在zookeeper上先创建好锁目录
2、如下代码使用curator提供的分布式锁来试下序号自增,这里没有考虑数据的上界,只是个样例:
2、如下代码使用curator提供的分布式锁来试下序号自增,这里没有考虑数据的上界,只是个样例:
package mytest; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.recipes.locks.InterProcessMutex; import org.apache.curator.retry.ExponentialBackoffRetry; /** * distributed sequential number generator based on zookeeper * prediction: zookeeper has the lock path already. this program just watch that path * @author sing * */ public class DistrSeqGen { private CuratorFramework curator; private InterProcessMutex mutex ; private String lockPath; private DistrSeqGen(String serverLoc,String lockPath) { // synchronized(DistrSeqGen.class) { curator = CuratorFrameworkFactory.builder() .connectString(serverLoc) .retryPolicy(new ExponentialBackoffRetry(1000,2)) .build(); curator.start(); this.lockPath = lockPath; // curator.usingNamespace(lockPath); mutex = new InterProcessMutex(curator, lockPath);//create the node automatically // } } /** * get next sequetial number * @return * @throws Exception */ public int next() throws Exception{ int seq =0; try { mutex.acquire(); byte[] seqInByte = curator.getData().forPath(this.lockPath); seq= Integer.parseInt(new String(seqInByte)); seq++; curator.setData().forPath(lockPath,new Integer(seq).toString().getBytes()); }catch(Exception e) { e.printStackTrace(); }finally { mutex.release(); } return seq; } public static class ClientRunnable implements Runnable{ private static final CyclicBarrier barrier = new CyclicBarrier(5); boolean interrupted =false; public void run() { while(!interrupted) { DistrSeqGen gen = new DistrSeqGen("localhost:2181","/DistrLock"); try { barrier.await(); System.out.println(Thread.currentThread().getName() + ":" + gen.next()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BrokenBarrierException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } if(Thread.currentThread().isInterrupted()) { interrupted = true; } } } } public static void main(String[] args) { // TODO Auto-generated method stub new Thread(new ClientRunnable()).start(); new Thread(new ClientRunnable()).start(); new Thread(new ClientRunnable()).start(); new Thread(new ClientRunnable()).start(); new Thread(new ClientRunnable()).start(); } }3、自测代码有个问题,每次获取了119个序号之后,就会无法再次获取到锁,然后就会失去zookeeper的链接。自测环境是本地zookeeper服务器,没有集群。
相关文章推荐
- 用类封装精灵的操作,并实例化各种精灵对象 精灵的数字序号使用单例模式的数字生成器实现
- .NET:可扩展的单据编号生成器 之 顺序号(防止重复)
- .NET:可扩展的单据编号生成器 之 基于缓冲区的顺序号
- .NET:可扩展的单据编号生成器 之 基于缓冲区的顺序号
- JavaScript 自动在表格前面增加序号
- Python高级编程--生成器
- GridView添加序号列
- 【Python】10“生成器和迭代器“
- 跪求一个木马生成器要零点的 谢谢!~
- Python基础(8)_迭代器、生成器、列表解析
- SQL Server 如何重新恢复自动编号列的序号
- d3利用弦生成器画折线图
- 很重要的排列生成器(列出几个字符的所有排列)
- C++11带来的随机数生成器
- CLR via C# 3 读书笔记(5):第1章 CLR执行模型 — 1.5 本地代码生成器工具:NGen.exe
- gridcontrol设置表头序号列标题
- Word 2007 插入自动编号的图标序号
- 深入浅出ES6(三):生成器 Generators
- UCPlusSKin For OCR2 皮肤生成器发布
- 7.7 Hibernate:内置生成器 – native