参照弹簧引导复述分布式锁,用注解实现时发现不能满足使用需求
于是自己开始摸索解决问题…
如下,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 类
弹簧引导复述分布式锁