分布式锁,默认是redis实现,可扩展接口增加zk、等其他实现
<dependency>
<groupId>cn.tsoft.framework</groupId>
<artifactId>distributed-lock</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<import resource="classpath:spring-lock.xml" />
<import resource="classpath:spring-redis.xml" />
import cn.tsoft.framework.lock.Lock;
import cn.tsoft.framework.lock.LockCallBack;
import cn.tsoft.framework.lock.DefaultLockCallBack;
@Autowired
Lock lock;
T t = lock.lock("Test_key_2",20,60,new LockCallBack<T>(){
public T handleObtainLock(){
dosomething();
}
public T handleNotObtainLock() throws LockCantObtainException{
return T;//throw new LockCantObtainException();
}
public T handleException(LockInsideExecutedException e) throws LockInsideExecutedException{
return T;//throw new e;
}
});
或
T t = lock.lock("Test_key_2",LockRetryFrequncy.VERY_QUICK,20,60,new DefaultLockCallBack<T>(T,T){
public T handleObtainLock(){
dosomething();
}
});
/**
* 锁重试获取频率策略
*
* @author ningyu
*
*/
LockRetryFrequncy.VERY_QUICK; //非常快
LockRetryFrequncy.QUICK; //快
LockRetryFrequncy.NORMAL; //中
LockRetryFrequncy.SLOW; //慢
LockRetryFrequncy.VERYSLOW; //很慢
//例如:
//以获取锁的超时时间为:1秒来计算
//VERY_QUICK的重试次数为:100次
//QUICK的重试次数为:20次
//NORMAL的重试次数为:10次
//SLOW的重试次数为:2次
//QUICK的重试次数为:1次
//这个重试策略根据自身业务来选择合适的重试策略
//锁名称:Test_key_2
//获取锁超时时间:20秒
//锁最大过期时间:60秒
//内部执行回调,包含(1.获取到锁回调,2.没有获取到锁回调,3.获取到锁内部执行业务代码报错)
//默认策略:NORMAL
lock.lock("Test_key_2",20,60,new LockCallBack<String>() {
@Override
public String handleException(LockInsideExecutedException e) throws LockInsideExecutedException {
logger.error("获取到锁,内部执行报错");
return "Exception";
}
@Override
public String handleNotObtainLock() throws LockCantObtainException {
logger.error("没有获取到锁");
return "NotObtainLock";
}
@Override
public String handleObtainLock() {
logger.info("获取到锁");
dosomething();
return "ok";
}
);
//锁名称:Test_key_2
//获取锁超时时间:20秒
//锁最大过期时间:60秒
//内部执行回调,使用默认回调实现,只需要实现获取到锁后需要执行的方法,当遇到没有获取锁和获取锁内部执行错误时会返回构造函数中设置的值(支持泛型)
//默认策略:NORMAL
lock.lock("Test_key_2",20,60,new DefaultLockCallBack<String>("NotObtainLock", "Exception") {
@Override
public String handleObtainLock() {
logger.info("获取到锁");
dosomething();
return "ok";
}
);
//锁名称:Test_key_2
//锁重试获取频率:VERY_QUICK 非常快
//获取锁超时时间:20秒
//锁最大过期时间:60秒
//内部执行回调,包含(1.获取到锁回调,2.没有获取到锁回调,3.获取到锁内部执行业务代码报错)
lock.lock("Test_key_2",LockRetryFrequncy.VERY_QUICK,20,60,new LockCallBack<String>() {
@Override
public String handleException(LockInsideExecutedException e) throws LockInsideExecutedException {
logger.error("获取到锁,内部执行报错");
return "Exception";
}
@Override
public String handleNotObtainLock() throws LockCantObtainException {
logger.error("没有获取到锁");
return "NotObtainLock";
}
@Override
public String handleObtainLock() {
logger.info("获取到锁");
dosomething();
return "ok";
}
);
//锁名称:Test_key_2
//锁重试获取频率:VERY_QUICK 非常快
//获取锁超时时间:20秒
//锁最大过期时间:60秒
//内部执行回调,使用默认回调实现,只需要实现获取到锁后需要执行的方法,当遇到没有获取锁和获取锁内部执行错误时会返回构造函数中设置的值(支持泛型)
lock.lock("Test_key_2",LockRetryFrequncy.VERY_QUICK,20,60,new DefaultLockCallBack<String>("NotObtainLock", "Exception") {
@Override
public String handleObtainLock() {
logger.info("获取到锁");
dosomething();
return "ok";
}
);