分散ロックの使用状況を飼育係

パッケージ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

 

おすすめ

転載: www.cnblogs.com/xiaozw/p/11926816.html