基于aspectj的自定义注解实现全局业务锁的方法
技术领域
1.本发明涉及计算机技术领域,具体涉及基于aspectj的自定义注解实现全局业务锁的方法。
背景技术:2.传统金融行业业务场景复杂,对一个数据会在多种场景下使用,同时数据的互斥性校验要求很高。
3.在这种场景下的常用解决方案,第一种方案使用之前校验其他场景下是否有该数据,这种方法在新场景下会失效,同时查询量比较大。第二种方案使用全局存储表,数据使用前后,在存储表中进行记录,达到留痕的目的,这种方案对源代码侵入较大,重复开发,业务代码与技术代码耦合,使用场景单一。
技术实现要素:4.本发明的目的是针对现有技术存在的不足,提供基于aspectj的自定义注解实现全局业务锁的方法。
5.为实现上述目的,本发明提供了基于aspectj的自定义注解实现全局业务锁的方法,包括:
6.步骤1、在java工程中引入aspectj的jar包或者maven中添加aspectj的依赖;
7.步骤2、根据业务场景新建三个注解,分别为加锁注解@lockdata、解锁注解@unlockdata和加解锁注解@periodiclock,并新建存储表busi_lock,所述存储表busi_lock的字段名称包括加锁数据主键pk_lock、加锁信息lock_message、时间戳ts和加锁数据对应业务来源信息pk_bill;
8.步骤3、定义所述注解的作用范围为方法级、周期为全周期、属性为默认值;
9.步骤4、在切面类中定义所述注解的切点;
10.步骤5、在切面类中设定拦截所述注解的方法;
11.步骤6、在业务方法上根据业务场景选择添加相应的注解。
12.进一步的,所述注解的属性包括加锁信息描述、加锁参数位置、加锁键名、锁重复写标识。
13.进一步的,所述加锁信息描述的默认值为空字符串,所述加锁参数位置的默认值为0,所述加锁键名的默认值为空字符串,所述锁重复写标识的默认值为false。
14.进一步的,所述步骤6具体包括:
15.在业务操作流程未完全结束,需要保持占用状态时选择添加加锁注解,具体如下:
16.在切面类中,使用@around注解通知自定义的@lockdata注解,在调用有lockdata注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法时,先执行切面类中的加锁方法,然后执行业务方法;
17.在业务流程结束后解除占用时,选择添加解锁注解,具体如下:
18.在切面类中,使用@afterreturning注解通知自定义的@unlockdata注解,在调用有unlock注解的方法时,aspectj针对该方法进行拦截,生成代理类,当业务方法成功执行结束后,执行切面类中的解锁方法,@afterreturning在方法出现异常后,不会执行切面类中的解锁操作;
19.在业务操作为原子操作,需要在业务方法执行期间保持占用状态时选择添加加解锁注解,具体如下:
20.在切面类中,使用@before注解通知自定义的@periodiclock注解,在调用有periodiclock注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法前,先执行切面类中的加锁方法,然后执行业务方法;使用@after注解通知自定义的@periodiclock注解,带有标记@periodiclock注解的业务方法执行结束后,会执行切面类中的解锁方法,无论业务方法执行成功与否,使用@after注解通知自定义的@periodiclock注解的解锁方法都会执行。
21.进一步的,所述切面类中的加锁方法具体如下:
22.在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,以加锁参数值作为pk_lock插入到存储表busi_lock中。
23.进一步的,所述切面类中的解锁方法具体如下:
24.在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,对存储表busi_lock执行pk_lock为加锁参数值的delete数据操作。
25.进一步的,还包括:在业务操作为重复操作,需要覆盖加锁时进行业务重复加锁,具体如下:
26.执行所述切面类中的加锁方法前,加入重复加锁的逻辑,所述重复加锁的逻辑为:在业务方法参数栈中,根据reset获取锁重复写标识,根据reset锁重复写标识判断是否需要重复加锁,如需要重复加锁,根据参数栈中获取的pk_bill值对存储表busi_lock执行pk_bill为条件的delete数据操作,其中,pk_bill为该业务操作对应的业务数据主键,执行完成delete数据操作之后,继续加锁操作。
27.有益效果:本发明不需要查询业务数据,当业务场景复杂时,仅仅需要查询该数据是否存在于存储表,将控制权交由加锁数据而非业务场景,实现查询的简单化,同时业务场景变化不会影响加锁数据的逻辑;基于aop的aspectj可以避免重复编程与业务逻辑和锁逻辑的解耦,使用多个自定义注解,细化锁的概念,丰富了加锁场景。
附图说明
28.图1是根据业务场景进行加锁的流程示意图;
29.图2是根据业务场景进行解锁的流程示意图;
30.图3是根据业务场景进行加解锁的流程示意图;
31.图4是根据业务场景进行重复加锁的流程示意图。
具体实施方式
32.下面结合附图和具体实施例,进一步阐明本发明,本实施例在以本发明技术方案为前提下进行实施,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围。
33.本发明实施例提供了基于aspectj的自定义注解实现全局业务锁的方法,包括:
34.步骤1、在java工程中引入aspectj的jar包或者maven中添加aspectj的依赖。
35.步骤2、根据业务场景新建三个注解,分别为@lockdata、@unlockdata和@periodiclock。其中,@lockdata为加锁注解,@unlockdata为解锁注解,@periodiclock为加解锁注解,并新建存储表busi_lock。存储表busi_lock的字段名称包括加锁数据主键pk_lock、加锁信息lock_message、时间戳ts和加锁数据对应业务来源信息pk_bill,字段类型及其含义如表1所示:
36.字段名称字段类型字段含义pk_lockchar(20)加锁数据主键lock_messagevarchar2(256)加锁信息tschar(19)时间戳pk_billchar(20)加锁数据对应业务来源信息
37.表1
38.其中,pk_lock字段添加unique唯一约束,利用数据库特性达到加锁校验的目的。
39.步骤3、定义注解的作用范围为方法级、周期为全周期、属性为默认值。具体的,上述注解的属性包括加锁信息描述、加锁参数位置、加锁键名、锁重复写标识。上述各个属性的默认值具体如下:加锁信息描述的默认值为空字符串,加锁参数位置的默认值为0,加锁键名的默认值为空字符串,锁重复写标识的默认值为false。三个注解的定义方式具体如下:
40.[0041][0042]
步骤4、在切面类中定义所述注解的切点。具体如下:
[0043][0044]
步骤5、在切面类中设定拦截注解的方法。具体的,设定@around拦截lockdata注解加锁,伪代码如下:
[0045][0046]
设定@afterreturning拦截unlockdata注解解锁,伪代码如下:
[0047][0048]
设定@before、@after拦截periodiclock注解,伪代码如下:
[0049]
步骤6、在业务方法上根据业务场景选择添加相应的注解。具体包括:
[0050]
在业务操作流程未完全结束,需要保持占用状态时选择添加加锁注解,具体如下:
[0051]
具参见图1,在切面类中,使用@around注解通知自定义的@lockdata注解,在调用有lockdata注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法时,先执行切面类中的加锁方法,然后执行业务方法。其中,上述切面类中的加锁方法具体如下:
[0052]
在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,以加锁参数值作为pk_lock插入到存储表busi_lock中。如果数据已经存储在存储表busi_lock中,即已经处于加锁状态,数据库会因为唯一索引抛出数据重复异常,不允许进行后续的业务操作。成功执行加锁后,执行业务方法,如果业务方法执行中出现异常,切面类方法会捕捉异常,讲加锁数据进行回滚删除操作,避免错误加锁。
[0053]
参见图2,在业务流程结束后解除占用时,选择添加解锁注解。具体如下:
[0054]
在切面类中,使用@afterreturning注解通知自定义的@unlockdata注解,在调用有unlock注解的方法时,aspectj针对该方法进行拦截,生成代理类,当业务方法成功执行结束后,执行切面类中的解锁方法,@afterreturning在方法出现异常后,不会执行切面类中的解锁操作。其中,切面类中的解锁方法具体如下:
[0055]
在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,对存储表busi_lock执行pk_lock为加锁参数值的delete数据操作。
[0056]
参见图3,在业务操作为原子操作,需要在业务方法执行期间保持占用状态时选择添加加解锁注解,具体如下:
[0057]
在切面类中,使用@before注解通知自定义的@periodiclock注解,在调用有periodiclock注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法前,先执行切面类中的加锁方法,然后执行业务方法。使用@after注解通知自定义的@periodiclock注解,带有标记@periodiclock注解的业务方法执行结束后,会执行切面类中的解锁方法,无论业务方法执行成功与否,使用@after注解通知自定义的@periodiclock注解的解锁方法都会执行。
[0058]
参见图4,本发明实施例还包括:在业务操作为重复操作,需要覆盖加锁时进行业务重复加锁,具体如下:
[0059]
执行所述切面类中的加锁方法前,加入重复加锁的逻辑,所述重复加锁的逻辑为:在业务方法参数栈中,根据reset获取锁重复写标识,根据reset锁重复写标识判断是否需要重复加锁,如需要重复加锁,根据参数栈中获取的pk_bill值对存储表busi_lock执行pk_bill为条件的delete数据操作,其中,pk_bill为该业务操作对应的业务数据主键,执行完成delete数据操作之后,继续加锁操作。与上述加锁操作区别于,除了必要的加锁参数pk_lock,还需要对应的业务数据主键pk_bill,一起插入存储表busi_lock中,以便后续重复加锁使用。
[0060]
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,其它未具体描述的部分,属于现有技术或公知常识。在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
技术特征:1.基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,包括:步骤1、在java工程中引入aspectj的jar包或者maven中添加aspectj的依赖;步骤2、根据业务场景新建三个注解,分别为加锁注解@lockdata、解锁注解@unlockdata和加解锁注解@periodiclock,并新建存储表busi_lock,所述存储表busi_lock的字段名称包括加锁数据主键pk_lock、加锁信息lock_message、时间戳ts和加锁数据对应业务来源信息pk_bill;步骤3、定义所述注解的作用范围为方法级、周期为全周期、属性为默认值;步骤4、在切面类中定义所述注解的切点;步骤5、在切面类中设定拦截所述注解的方法;步骤6、在业务方法上根据业务场景选择添加相应的注解。2.根据权利要求1所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,所述注解的属性包括加锁信息描述、加锁参数位置、加锁键名、锁重复写标识。3.根据权利要求2所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,所述加锁信息描述的默认值为空字符串,所述加锁参数位置的默认值为0,所述加锁键名的默认值为空字符串,所述锁重复写标识的默认值为false。4.根据权利要求1所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,所述步骤6具体包括:在业务操作流程未完全结束,需要保持占用状态时选择添加加锁注解,具体如下:在切面类中,使用@around注解通知自定义的@lockdata注解,在调用有lockdata注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法时,先执行切面类中的加锁方法,然后执行业务方法;在业务流程结束后解除占用时,选择添加解锁注解,具体如下:在切面类中,使用@afterreturning注解通知自定义的@unlockdata注解,在调用有unlock注解的方法时,aspectj针对该方法进行拦截,生成代理类,当业务方法成功执行结束后,执行切面类中的解锁方法,@afterreturning在方法出现异常后,不会执行切面类中的解锁操作;在业务操作为原子操作,需要在业务方法执行期间保持占用状态时选择添加加解锁注解,具体如下:在切面类中,使用@before注解通知自定义的@periodiclock注解,在调用有periodiclock注解的方法时,aspectj针对该方法进行拦截,生成代理类,执行该业务方法前,先执行切面类中的加锁方法,然后执行业务方法;使用@after注解通知自定义的@periodiclock注解,带有标记@periodiclock注解的业务方法执行结束后,会执行切面类中的解锁方法,无论业务方法执行成功与否,使用@after注解通知自定义的@periodiclock注解的解锁方法都会执行。5.根据权利要求4所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,所述切面类中的加锁方法具体如下:在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,以加锁参数值作为pk_lock插入到存储表busi_lock中。6.根据权利要求4所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在
于,所述切面类中的解锁方法具体如下:在业务方法参数栈中,根据argposition获取加锁参数位置,attribute反射获取加锁参数实例值,对存储表busi_lock执行pk_lock为加锁参数值的delete数据操作。7.根据权利要求4所述的基于aspectj的自定义注解实现全局业务锁的方法,其特征在于,还包括:在业务操作为重复操作,需要覆盖加锁时进行业务重复加锁,具体如下:执行所述切面类中的加锁方法前,加入重复加锁的逻辑,所述重复加锁的逻辑为:在业务方法参数栈中,根据reset获取锁重复写标识,根据reset锁重复写标识判断是否需要重复加锁,如需要重复加锁,根据参数栈中获取的pk_bill值对存储表busi_lock执行pk_bill为条件的delete数据操作,其中,pk_bill为该业务操作对应的业务数据主键,执行完成delete数据操作之后,继续加锁操作。
技术总结本发明公开了基于AspectJ的自定义注解实现全局业务锁的方法。该方法包括在JAVA工程中引入AspectJ的jar包或者maven中添加AspectJ的依赖,根据业务场景新建加锁注解、解锁注解和加解锁注解,并新建存储表,定义注解的作用范围为方法级、周期为全周期、属性为默认值,在切面类中定义注解的切点,在切面类中设定拦截注解的方法,在业务方法上根据业务场景选择添加相应的注解。本发明不需要查询业务数据,当业务场景复杂时,仅需要查询该数据是否存在于存储表,将控制权交由加锁数据而非业务场景,实现查询的简单化,同时业务场景变化不会影响加锁数据的逻辑,使用多个自定义注解,细化锁的概念,丰富了加锁场景。丰富了加锁场景。丰富了加锁场景。
技术研发人员:孙煜 吴玮 张伶俐 王宗力
受保护的技术使用者:江苏金融租赁股份有限公司
技术研发日:2022.07.01
技术公布日:2022/11/1