自定义防并发注解

需求背景:

因为一些比如退单之类的接口处理流程没有做幂等性校验,只有接口开头有一个检验同一笔订单请求挂起一秒钟,所以在接口处理流程阻塞状态下,多笔请求进来的时候就造成了幂等性的问题,以我自己的思维模式考虑的话,首先是前端需要加上校验,后端接口在最小影响范围内的话是把1秒时间扩大,但是领导是个有技术追求的人,所以提出了自定义一个防并发注解

自定义注解

在Java中,注解分为两种,元注解和自定义注解。

很多人误以为自定义注解就是开发者自己定义的,而其它框架提供的不算,其实我们经常会用到的一些如@Override、@Autowired、@Service等,这些都是JDK或者诸如Spring这类框架给我们提供的,都属于自定义注解。

关于"元"这个描述,在编程世界里面有都很多,比如"元注解"、"元数据"、"元类"、"元表"等等,这里的"元"其实都是从meta翻译过来的。

一般我们把元注解理解为描述注解的注解,元数据理解为描述数据的数据,元类理解为描述类的类

所以,在Java中,除了有限的几个固定的"描述注解的注解"以外,所有的注解都是自定义注解。

在JDK中提供了4个标准的用来对注解类型进行注解的注解类(元注解),他们分别是:

@Target
@Retention
@Documented
@Inherited

除了以上这四个,所有的其它注解全部都是自定义注解。

 

 

那么我这次做的这个自定义注解是用apring的AOP实现的,因为保密协议和知识产权原因,以下代码经过加工

首先先自定义一个注解

然后就就是注解的实现类:

首先定义一个切点

 

然后定义一个环绕类型的切面实现

具体代码就不展示了,主要逻辑是,注解参数组成一个唯一的key,放到缓存里面,下次请求进来,如果缓存还存在就中断流程,返回重复提交巴拉巴拉的内容,如果不存在就set到缓存里面,使用 joinPoint.proceed() 继续执行被注解方法,然后在finally里面强制释放缓存

 注意如果是springBoot,只需要在注解实现类上加上@Aspect 和 @Component注解就好,如果是springMvc的话,并且是在controller层使用的话,需要手动把生成管理交给springMVC容器
 

 

具体使用方法:

#user.name  使用el表达式获取参数列表指定的参数,注解之内还有解析方法,具体可以参考   https://mp.csdn.net/mp_blog/creation/editor/118080404

自定义注解实现分布式锁是一种在分布式系统中解决并发问题的方法。通过在需要加锁的方法上添加自定义注解,可以实现对该方法的并发控制。具体实现步骤如下: 1. 首先,在项目的pom文件中引入相关的依赖,以支持分布式锁的功能。 2. 在项目中创建一个新的目录,并使用元注解来定义自定义注解。这个自定义注解可以用来标记需要加锁的方法。 3. 在具体的业务实现类中,使用自定义注解来标记需要加锁的方法。这样,在方法执行时,会根据注解的配置来进行并发控制。 使用自定义注解实现分布式锁的好处是可以避免在每个需要加锁的方法中都引入相关的配置类和方法,提高了代码的可读性和可维护性。此外,还可以将配置和项目打包成jar包,方便在其他项目中引入使用。 分布式锁相对于普通锁的区别在于,普通锁只能在单体应用中锁住方法,而分布式锁可以在分布式系统中实现并发控制。在分布式系统中,不同实例之间共用代码和数据库,因此需要使用分布式锁来保证并发操作的正确性。分布式锁可以使用一些工具,如Redis,将锁放在共享的资源中,以实现多个实例共用一个锁的效果。 总结来说,自定义注解实现分布式锁是一种方便且可扩展的方式,可以在分布式系统中解决并发问题。 #### 引用[.reference_title] - *1* [自定义注解实现分布式锁](https://blog.csdn.net/qq_37205211/article/details/122140430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [分布式编程-实现分布式锁-优雅的使用自定义注解实现](https://blog.csdn.net/qq_41692766/article/details/105842467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [自定义注解,基于redis实现分布式锁](https://blog.csdn.net/weixin_43975276/article/details/131097829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值