package com.aol.micro.server.curator.lock;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.aol.micro.server.dist.lock.DistributedLockService;
@Component
public class CuratorDistributedLockServiceProvider {
final private CuratorFramework curatorFramework;
final private String lockBasePath;
@Autowired
public CuratorDistributedLockServiceProvider(
@Value("${zookeeper.connectionString:localhost:12181}") String zookeeperConnectionString,
@Value("${zookeeper.sleepTime:1000}") String sleepTime, @Value("${zookeeper.maxRetries:3}") String maxRetries,
@Value("${curator.lockBasePath:/tmp/zookeeper}") String lockBasePath) {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(Integer.valueOf(sleepTime), Integer.valueOf(maxRetries));
this.curatorFramework = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
this.lockBasePath = lockBasePath;
curatorFramework.start();
}
/**
* @param timeout - timeout for locking in milliseconds
* @return DistributedLockService backed up by curator instance
*/
public DistributedLockService getDistributedLock(int timeout) {
try {
DistributedLockServiceCuratorImpl lock = new DistributedLockServiceCuratorImpl(curatorFramework, lockBasePath, timeout);
curatorFramework.getConnectionStateListenable().addListener(lock);
return lock;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}