注解+切面式的分布式锁

一、案例需求

    在一个SpringBoot项目,其中定时任务和web端代码耦合在一起,并部署在多个服务器节点上,但这样会存在一个问题,每个节点都会触发一次定时任务,这显然重复执行了。为了达到唯一控制效果,引入了分布式锁的功能。但是有个缺点是每写一个定时任务都得写一份与业务无关的分布式锁代码,这样造成大量的冗余代码。所以想着通过注解+切面的方式来实现代码的精简。

二、代码

1.注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EnableDistributedLock {

     String key();

     int expTime() default 30;
}

分布式锁用的是redis实现的,所以注解简单定义了key和过期时间。

2.AOP

@Aspect
@Component
public class DistributedLockAspect {

    private final static Logger logger = LoggerFactory.getLogger(DistributedLockAspect.class);

    @Resource(name = "exclusiveLock")
    private DistributedLock exclusiveLock;


    @Pointcut("@annotation(EnableDistributedLock)")
    public void distributedLockPointCut() {

    }

    @Around("distributedLockPointCut()")
    public void aroud(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        Method method = methodSignature.getMethod();
        method.setAccessible(true);
        EnableDistributedLock enableDistributedLock = method.getAnnotation(EnableDistributedLock.class);
        String lockKey = enableDistributedLock.key();
        if (StringUtils.isBlank(lockKey)) {
            throw new Throwable("分布式锁aop错误,key为空,请检查注解配置");
        }
        if (exclusiveLock.isLock(lockKey)) {
            logger.info("该任务已在进行,正常退出");
            return;
        } else {
            exclusiveLock.lock(lockKey);
        }
        try {
            joinPoint.proceed();
        } catch (Exception e) {
            throw e;
        } finally {
            exclusiveLock.unLock(lockKey);
        }
    }
}

这个AOP呢,其实就是注解的处理类,扫描带有@EnableDistributedLock注解的方法,然后环绕注释方法添加分布式锁的相关代码。

3.使用

 @EnableDistributedLock(key = lockKey, expTime = 60 * 3)
 public void execute() {
     	//业务代码
 }

需要用的方法添加@EnableDistributedLock即可,且支持方法在多节点下唯一执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是 Spring 注解? Spring 注解是一种用于声明 Spring 管理的对象和组件的注解。它们可以替代传统的 XML 配置文件,使代码更简洁,更易于维护。 2. Spring 中常用的注解有哪些? 常用的 Spring 注解包括: - @Autowired:自动装配依赖对象。 - @Component:声明一个组件。 - @Controller:声明一个 MVC 控制器。 - @Service:声明一个服务。 - @Repository:声明一个数据访问对象。 - @RequestMapping:映射请求到控制器方法。 - @ResponseBody:将方法返回值转换为 HTTP 响应。 - @PathVariable:获取 URL 路径参数。 - @RequestParam:获取请求参数。 - @Transactional:声明事务。 3. @Autowired 和 @Resource 的区别是什么? @Autowired 是 Spring 提供的注解,用于自动装配依赖对象。它按照类型进行匹配,如果存在多个匹配项,则按照名称进行匹配。 @Resource 是 Java EE 提供的注解,也可以用于自动装配依赖对象。它按照名称进行匹配,如果存在多个匹配项,则按照类型进行匹配。 4. 什么是 Spring Boot? Spring Boot 是 Spring 官方提供的一个快速开发框架,它简化了 Spring 应用的搭建和配置,提供了自动配置、快速启动、依赖管理等功能,使开发者能够更快、更方便地开发出高质量的应用程序。 5. Spring Boot 中常用的注解有哪些? Spring Boot 中常用的注解包括: - @SpringBootApplication:声明一个 Spring Boot 应用程序。 - @RestController:声明一个 RESTful Web 服务。 - @RequestMapping:映射请求到控制器方法。 - @GetMapping、@PostMapping、@PutMapping、@DeleteMapping:分别映射 GET、POST、PUT、DELETE 请求到控制器方法。 - @RequestBody:将 HTTP 请求体转换为方法参数。 - @PathVariable:获取 URL 路径参数。 - @RequestParam:获取请求参数。 - @Autowired:自动装配依赖对象。 - @Value:获取配置属性。 6. 什么是 Spring Cloud? Spring Cloud 是基于 Spring Boot 的一套分布式系统开发工具,它提供了一系列的分布式系统开发工具,包括服务注册与发现、配置中心、负载均衡、断路器、网关等,使得开发者能够更快、更方便地开发出高可用、高可靠、高扩展性的分布式系统。 7. Spring Cloud 中常用的注解有哪些? Spring Cloud 中常用的注解包括: - @EnableDiscoveryClient:启用服务注册与发现。 - @EnableFeignClients:启用 Feign 客户端。 - @EnableCircuitBreaker:启用断路器。 - @HystrixCommand:声明一个断路器命令。 - @LoadBalanced:启用负载均衡。 - @RefreshScope:声明一个动态刷新的 Bean。 - @ConfigurationProperties:获取配置属性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值