パッケージcom.example.demo3.zk; インポートlombok.extern.slf4j.Slf4j; インポート org.apache.storm.shade.org.apache.zookeeper *。; インポートjava.util.concurrent.CountDownLatch; / ** *初期化する飼育係ロックを取得し、ロックを解除します。一時的なロックを作成します。 * / @ SLF4J パブリック クラスZooKeeperSession { プライベート 静的 AたCountDownLatchたCountDownLatch = 新しい新たCountDownLatchに(1。;) プライベートのZooKeeperのZooKeeper; // ディレクトリ プライベート文字列LOCKPATH = "/注文IDロック- " ; / ** *接続のZooKeeper * / パブリックZooKeeperSession(){ 試み{ // 连接ZK服务器 この .zooKeeper = 新しいのZooKeeper( "192.168.132.154:2181,192.168.132.156:2181,192.168.132.155:2181" 、 50000、新しいZooKeeperWatcher()); log.info( "状态:" + 。zooKeeper.getState()のtoString()); 試す{ countDownLatch.await()。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } キャッチ(例外e){ e.printStackTrace(); } log.info( "ZooKeeperのセッション建立......" ); } / ** *获取分布式锁 * @param 注文ID * / 公共 ボイドacquireDistributeLock(ロング注文ID){ 文字列のパス = LOCKPATH + 注文ID。 試す{ zooKeeper.create(パス、 "" .getBytes()、ZooDefs.Ids.OPEN_ACL_UNSAFE、CreateMode.EPHEMERAL)。 log.info( "注文の取得ロックに成功[ID =" +注文ID + "]" )。 } キャッチ(例外e){ e.printStackTrace(); int型のカウント= 0; 一方、(真){ 試み{ のThread.sleep( 20 )。 zooKeeper.create(パス、 "" .getBytes()、ZooDefs.Ids.OPEN_ACL_UNSAFE、CreateMode.EPHEMERAL)。 } キャッチ(例外E1){ e1.printStackTrace()。 カウント ++ ; 続け; } log.info(「注文の取得ロックに成功[ID =」+注文ID + + +「回......試みる」カウント「後」)。 ブレーク; } } } / ** *释放分布式锁 * @param 注文ID * / 公共 ボイドreleaseDistributeLock(ロング注文ID){ 文字列のパス = LOCKPATH + 注文ID。 試す{ zooKeeper.delete(パス、 -1 )。 } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } キャッチ(KeeperException電子){ e.printStackTrace(); } } プライベート クラス ZooKeeperWatcher実装ウォッチャー{ @Override 公共 のボイドプロセス(WatchedEventイベント){ log.info( "監視イベントを受信:" + event.getState()); もし(Event.KeeperState.SyncConnected == event.getState()){ countDownLatch.countDown()。 } } } / ** *封装单例静态内部类。 * / プライベート 静的 クラスシングルトン{ プライベート 静的ZooKeeperSessionインスタンス。 静的{ インスタンス = 新しいZooKeeperSession()。 } パブリック 静的ZooKeeperSession getIntance(){ 戻りインスタンス; } } / ** *は、シングルトンを取得します。 * @Return * / パブリック 静的ZooKeeperSessionのgetInstance(){ リターン(;)Singleton.getIntance } / ** *例が初期化されます。 * / パブリック 静的 ボイドのinit(){ のgetInstance(); } }
メソッドを呼び出します。
パッケージcom.example.demo3。 輸入com.example.demo3.zk.ZooKeeperSession。 輸入lombok.extern.slf4j.Slf4j; 輸入org.junit.Test; SLF4J @ パブリック クラス TestZooKeeperが延びDemo3ApplicationTestsを{ / ** *测试分布式锁。 * / @Test 公共 ボイドtestZookeeper(){ ロング注文ID = 1L 。 ZooKeeperSession zooKeeperSessionは = 新しいZooKeeperSessionを(); log.info( "获取锁" ); zooKeeperSession.acquireDistributeLock(注文ID)。 log.info( "ビジネスロジックを実行..."); zooKeeperSession.releaseDistributeLock(注文ID)。 log.info( "释放锁" ); } }
結果:
ソースのダウンロード:
リンクします。https://pan.baidu.com/s/1rgyoxf9lLTjDIWX-Ro5o-Q
抽出コード:ke31