ZooKeeper - 3 Curator分散式鎖使用樣例:模擬12306售票
阿新 • • 發佈:2020-12-29
ZooKeeper Curator分散式鎖 - 使用樣例:模擬12306售票
匯入座標 外掛
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!--curator--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>4.0.0</version> </dependency> <!--日誌--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
執行緒任務(買票服務) - Ticket12306
package com.itheima.curator; import org.apache.curator.RetryPolicy; 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; import java.util.concurrent.TimeUnit; public class Ticket12306 implements Runnable{ private int tickets = 10;//資料庫的票數 private InterProcessMutex lock ; public Ticket12306(){ //重試策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10); //2.第二種方式 //CuratorFrameworkFactory.builder(); CuratorFramework client = CuratorFrameworkFactory.builder() .connectString("192.168.149.135:2181") .sessionTimeoutMs(60 * 1000) .connectionTimeoutMs(15 * 1000) .retryPolicy(retryPolicy) .build(); //開啟連線 client.start(); lock = new InterProcessMutex(client,"/lock"); } @Override public void run() { while(true){ //獲取鎖 try { lock.acquire(3, TimeUnit.SECONDS); if(tickets > 0){ System.out.println(Thread.currentThread()+":"+tickets); Thread.sleep(100); tickets--; } } catch (Exception e) { e.printStackTrace(); }finally { //釋放鎖 try { lock.release(); } catch (Exception e) { e.printStackTrace(); } } } } }
LockTest
package com.itheima.curator; public class LockTest { public static void main(String[] args) { Ticket12306 ticket12306 = new Ticket12306(); //建立客戶端 Thread t1 = new Thread(ticket12306,"攜程"); Thread t2 = new Thread(ticket12306,"飛豬"); t1.start(); t2.start(); } }