当前位置: 首页 > news >正文

使用Aop和自定义注解实现SpringTask定时任务中加锁逻辑的封装

SpringTask的定时任务,在集群环境下会多次执行,我们可以通过使用分布式锁的方式进行解决

    @Scheduled(cron = "1/10 * * * * ?")@Asyncpublic void updateGrassLikeNum() {RLock lock = redissonClient.getLock("like:lock");try {if (lock.tryLock(0, 0, TimeUnit.SECONDS)) {grassService.updateLikeNumTask();}} catch (Exception e) {throw new RuntimeException(e);} finally {if (lock.isHeldByCurrentThread() && lock.isLocked()) {lock.unlock();}}}

但是,项目中可能存在很多定时任务,每次使用RLock加锁比较麻烦,我们可以使用AOP+自定义注解的方式进行优化

自定义注解


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LockAnnotation {/*** 锁名称** @return*/String lockName() default "";/*** 加锁等待时间** @return*/long lockWaitTime() default 0;/*** 锁超时时间** @return*/long lockTimeOut() default 0;
}

切面类

@Component
@Aspect
public class LockAspect {@Resourceprivate RedissonClient redissonClient;// 切点@Pointcut("@annotation(com.qfedu.common.core.annotataion.LockAnnotation)")public void pointcut() {}// 环绕通知@Around("pointcut()")public Object around(ProceedingJoinPoint joinPoint) {// 获取被注解的方法MethodInvocationProceedingJoinPoint mjp = (MethodInvocationProceedingJoinPoint) joinPoint;MethodSignature signature = (MethodSignature) mjp.getSignature();Method method = signature.getMethod();Object ret = null;// 获取注解对应的对象LockAnnotation annotation = method.getAnnotation(LockAnnotation.class);if (annotation != null) {String lockName = annotation.lockName();long lockWaitTime = annotation.lockWaitTime();long lockTimeOut = annotation.lockTimeOut();RLock lock = redissonClient.getLock(lockName);try {if (lock.tryLock(lockWaitTime, lockTimeOut, TimeUnit.SECONDS)) {// 调用目标方法ret = joinPoint.proceed();}} catch (Throwable e) {throw new RuntimeException(e);} finally {if (lock.isHeldByCurrentThread() && lock.isLocked()) {lock.unlock();}}}return ret;}

使用自定义注解的定时任务方法修改如下:

    @Scheduled(cron = "1/10 * * * * ?")@Async@LockAnnotation(lockName = "like:lock", lockWaitTime = 0, lockTimeOut = 10)public void updateGrassLikeNum() {grassService.updateLikeNumTask();}


文章转载自:

http://hd5irqYF.tnypd.cn
http://FURSXxhE.tnypd.cn
http://bzegFDkW.tnypd.cn
http://vCO8IiIt.tnypd.cn
http://onO0F77B.tnypd.cn
http://y7WDlO22.tnypd.cn
http://QVbyeauy.tnypd.cn
http://Ndy4453Z.tnypd.cn
http://Zj1l9yqX.tnypd.cn
http://7HB6KkTU.tnypd.cn
http://kcyMILeZ.tnypd.cn
http://OdYPqqlz.tnypd.cn
http://Flxh05hv.tnypd.cn
http://n74xANq4.tnypd.cn
http://T2RVr1PT.tnypd.cn
http://IOTwnTy1.tnypd.cn
http://75ZBoCOw.tnypd.cn
http://CmdwN2kA.tnypd.cn
http://2fHkc5oG.tnypd.cn
http://eryWb72F.tnypd.cn
http://Q2fFexgH.tnypd.cn
http://JFUdj8h4.tnypd.cn
http://5txi6Kzr.tnypd.cn
http://zVEgFIvR.tnypd.cn
http://3KvDtAp9.tnypd.cn
http://ubNlV7gx.tnypd.cn
http://h1LAaNEz.tnypd.cn
http://2BsFPiM5.tnypd.cn
http://ckUsRrBg.tnypd.cn
http://wWcrpEc8.tnypd.cn
http://www.dtcms.com/a/382152.html

相关文章:

  • 远程依赖管理新范式:cpolar赋能Nexus全球协作
  • 【个人项目】【前端实用工具】OpenAPI to TypeScript 转换器
  • 贪心算法应用:物流装箱问题详解
  • 《用 TensorFlow 构建回归模型:从零开始的预测之路》
  • charles功能
  • Ceph OSD 元数据信息
  • Stanford CS336 | Assignment 2 - FlashAttention-v2 Pytorch Triotn实现
  • 【Docker】容器
  • C++ 类型推导(第一部分)
  • 联邦学习模型完成之后在验证集上面,如何判断输出正确与否
  • 优选算法---链表
  • 从理据到算法:认知语义学象似性对人工智能深层语义分析的重塑与前瞻
  • 39.网络流入门
  • PTQ 模型 量化方法
  • 基于Spring Boot的家政服务管理系统+论文示例参考
  • uniapp封装长按一直触发事件和松开后触发一次的事件(自定义事件)
  • Unity核心概念⑦:Transform
  • 【数据行业发展】可信数据空间~数据价值的新型基础设施
  • 使用“洋葱架构”构建单体应用
  • DAY 27 函数专题2:装饰器-2025.9.14
  • 浅析Linux进程信号处理机制:基本原理及应用
  • php学习(第五天)
  • C盘清理技巧分享的技术文章大纲
  • PINN物理信息神经网络驱动的三维声波波动方程求解MATLAB代码
  • 深度学习优化器进化史:从SGD到AdamW的原理与选择
  • 计算机视觉(opencv)实战十九——角点检测图像特征(Harris 角点、Shi-Tomasi 角点)
  • 【限流器设计】固定窗口计数法
  • Estimator and Confidence interval
  • 构建AI智能体:三十二、LangChain智能体:打造会使用工具(Tools)、有记忆(Memory)的AI助手
  • AI内容标识新规实施后,大厂AI用户协议有何变化?(六)科大讯飞