弹簧引导复述分布式锁

  


参照弹簧引导复述分布式锁,用注解实现时发现不能满足使用需求

于是自己开始摸索解决问题…


如下,value 是锁的钥匙,因为业务的需要的关键是“cancelOrder_123_321"123年是订单ID, 321是用户ID

@RedisLock (=value “cancelOrder_ # {# order.orderNo} _ # {# memberId}“)   @ transactional (rollbackFor =, {RuntimeException.class, Exception.class})   public  void  cancelOrder (Order ,, String  memberId), {   ,,,log.info(“用户:{},订单号:{},开始执行取消流程…“,order.getOrderNo (), memberId);   ,,,String  orderNo =, order.getOrderNo ();   ,,,Order  updateOrder =, new 订单();   ,,,updateOrder.setOrderNo (orderNo);   ,,,updateOrder.setOrderState (OrderStateEnum.CANCELED.getKey ());

长话短说,需要了解详情的朋友看其他大神的博客


为什么我可以这样,写?

这里最重要的是什么?

,,,是因为我将这个el表达式字符串,解析成了复合型了。复合型简单点就是集列表合,集合里有el表达式和文本,用了顺序执行。

春天引导复述分布式锁

代码如下:

方面类

private  static  final  OperationExpressionEvaluator  evaluator =, new  OperationExpressionEvaluator ();      @Around (“lockPoint ()“)   public  Object 周围(ProceedingJoinPoint  pjp), {throws  Throwable   ,,,Method  Method =, ((MethodSignature) pjp.getSignature ()) .getMethod ();   ,,,RedisLock  RedisLock =, method.getAnnotation (RedisLock.class);   ,,,String  key =, getKey (redisLock.value()方法,pjp.getArgs (), pjp.getTarget ());      ,,,int  retryTimes =, redisLock.action () .equals (RedisLock.LockFailAction.CONTINUE), ?, redisLock.retryTimes (),:, 0;      ,,,boolean  lock =, redisLockImpl.lock(键,redisLock.keepMills (), retryTimes, redisLock.sleepMills ());      ,,,如果(锁){   ,,,,,,,log.debug (“get  lock 失败:{}“,键);   ,,,,,,,return 零;   ,,,}      ,,,log.debug (“get  lock 成功:{}“,键);   ,,,试着{   ,,,,,,,return  pjp.proceed ();   ,,,}catch  (Exception  e) {   ,,,,,,,log.error (“execute  locked  method  occured  an  exception", e);   ,,,},{finally    ,,,,,,,boolean  releaseResult =, redisLockImpl.releaseLock(关键);   ,,,,,,,log.debug (“release 锁:{},{}“,钥匙,releaseResult  ?,“success":“failed");   ,,,}      ,,,return 零;      }      private  String  getKey (String 关键,Method 方法,Object  [], args, Object 目标){   ,,,如果(key.length (), & lt;=, 0) {   ,,,,,,,return  Arrays.toString (args);   ,,,}   ,,,return  String.valueOf (generateKey(方法,关键参数、目标);   }      private  Object  generateKey (String 关键,Method 方法,Object  [], args, Object 目标),{   ,,,,,,,EvaluationContext  EvaluationContext =, evaluator.createEvaluationContext(方法,参数,,,,target.getClass (),, null);   ,,,,,,,return  evaluator.key(钥匙,,evaluationContext);   }


OperationExpressionEvaluator 类

弹簧引导复述分布式锁