一种基于AOP+ThreadLocal技术的分布式系统断点重试方法技术方案

技术编号:31315493 阅读:20 留言:0更新日期:2021-12-12 23:48
本发明专利技术公开了一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,属于软件信息技术领域,本发明专利技术的技术方案包括:步骤1:通过AOP切面表达式指定需要支持断点重试的方法并定义所有方法的OperationType;步骤2:在需要支持断点重试的业务流程中开启断点重试;步骤3:在发生异常后,持久化已经执行成功的方法返回值;步骤4:清空ThreadLocal变量,防止内存溢出,其目的在于,克服现有技术手工处理人力浪费、耗时长、容易出错的缺陷,实现了断点重试、多次断点重试的效果,同时降低发生异常数据的风险概率。风险概率。风险概率。

【技术实现步骤摘要】
一种基于AOP+ThreadLocal技术的分布式系统断点重试方法


[0001]本专利技术属于软件信息
,具体涉及一种基于AOP+ThreadLocal技术的分布式系统断点重试方法。

技术介绍

[0002]在业务系统中,因为网络或者异常数据等一些原因,程序会发生异常,在失败后如何保持交易的原子性和一致性是需要着重考虑的一个问题。
[0003]在单体架构中,因为只有涉及到一个应用,解决以上原子性和一致性问题,只需要开启声明式事务管理就可以了。在分布式架构中实现原子性和一致性首先想到的是通过分布式事务来实现,分布式事务方案包括:XA、TCC、本地消息表、可靠消息最终一致性等。我们较为熟悉的开源分布式事务框架:Seata,其包含AT模式、TCC模式、sage模式、XA模式。还有蚂蚁金服黑科技:DTX,其包含TCC模式、FMT托管模式、XA模式。
[0004]以上方案可以解决分布式一致性问题,但是或多或少需要引入其他中间件,或者部署额外的服务,或者部署一个分布式事务协调中心来实现。但是对于中小型公司而言引入中间件需要专项团队来维护其稳定性,部署额外的服务也需要人力去维护。
[0005]所以对于大部分的分布式接口调用,如果使用分布式事务很繁琐,直接就是监控、记录日志、事后快速的定位排查问题、通过重试来保证业务最终执行成功。
[0006]在发生异常时,一般主要涉及三种业务场景,1)在业务流程入口处直接中断了;2)在业务流程执行中途中断,但是此时只执行了一些查询操作没有任何修改操作;3)在业务流程执行到中途中断,但此时已经执行了大量的增删改操作。对于前两种业务场景,因为没有涉及到更新操作,那么直接发起重试无需人为过多干预,但是对于第三种业务场景下,同样也是最常见的情况,其通常采用手工处理的方式,需要手工处理大量的数据来回滚已经成功的操作,或者修复未完成的操作,然后才能发起手工重试,存在耗费大量的人力的问题,其次手工干预也带来了一定的异常数据风险。

技术实现思路

[0007]为了解决上述现有技术存在的缺陷,本专利技术的目的在于提供一种基于AOP+ThreadLocal 技术的分布式系统断点重试方法,其目的在于,克服现有技术手工处理人力浪费、耗时长、容易出错的缺陷,实现了断点重试、多次断点重试的效果,同时降低发生异常数据的风险概率。
[0008]本专利技术采用的技术方案如下:
[0009]一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,包括如下步骤:
[0010]步骤1:通过AOP切面表达式指定需要支持断点重试的方法并定义所有方法的 OperationType;
[0011]步骤2:在需要支持断点重试的业务流程中开启断点重试;
[0012]步骤3:在发生异常后,持久化已经执行成功的方法返回值;
[0013]步骤4:清空ThreadLocal变量,防止内存溢出。
[0014]其中,所述步骤1具体包括:
[0015]步骤1.1:借助AspectJ插件,通过其中的@PointCut注解来指定切面;
[0016]步骤1.2:通过execution、@annotation函数名称进行匹配,或是通过args、@args方法参数进行匹配,或是通过within、target类名来进行匹配;
[0017]步骤1.3:指定之后,AOP通过动态代理技术,对于所指定的方法进行环切,在方法执行前做重试的判断,或是在方法执行之后获取执行结果,并获取返回值;
[0018]在上述步骤中,在已经指定的方法中,如果想要支持忽略查询方法断点重试,需要在方法中加入此方法的操作类型注解@OperationType,反之则默认为更新交易。
[0019]在上述步骤中,如果为查询操作则指定@OperationType(value=“query”),如果为更新操作则指定@OperationType(value=“update”)。
[0020]在上述步骤中,在项目中假如我们想对于所有的remote包下面的所有方法支持断点重试,那么我们可以这么定义:execution(*com.company.remote.*.*(..))。..))。
[0021]所述步骤2具体包括:
[0022]步骤2.1:对于业务流程F开启断点重试,只需要调用supportRetry()方法,其中如果重试标识为false,则是正常交易流程,进行正常逻辑处理;如果重试标识为true,则是重试交易流程,进行重试逻辑处理。
[0023]在上述步骤中,所述步骤2.1中为正常交易交易,处理流程具体为:
[0024](1)程序将以上几个参数放入ThreadLocal变量inputThreadLocal;
[0025](2)在业务流程执行过程中,假设执行到方法m1,那么首先判断程序通过 inputThreadLocal是否为空,如果为空,说明开启了断点重试,如果不为空则说明没有开启断点重试,如果开启了断点重试,那么从inputThreadLocal中获取当前线程的入参信息,判断重试处理标识;
[0026](3)判断重试处理标识是为false,则首先通过代理类执行实际方法,获取返回结果和返回值信息,判断结果为成功,则继续判断是否为查询交易,如果是忽略查询方法==true&& @OperationType(value=“query”),则不保存方法结果信息,否则将结果放入ThreadLocal 变量outputThreadLocal,并返回;判断结果为失败,则直接返回不做任何处理。
[0027]在上述步骤中,所述步骤2.1中为重试交易流程,处理流程具体为:
[0028](1)首先通过交易唯一流水号查询出上次执行的结果信息并放入ThreadLocal变量 outputThreadLocal中,然后将入参放入ThreadLocal变量inputThreadLocal中;
[0029](2)在业务流程执行过程中,假如说执行到方法m2,那么首先判断程序通过 inputThreadLocal是否为空,如果为空,说明开启了断点重试,如果不为空则说明没有开启断点重试,如果开启了断点重试,那么从inputThreadLocal中获取当前线程的入参信息,判断重试处理标识。
[0030](3)判断重试处理标识是为true,则首先从outputThreadLocal中上次方法的执行记录,然后通过方法全限定名称和当前调用次数匹配到对应的上次执行记录,如果查询为空,则说明此方法还没有执行或者执行失败,通过代理直接调用方法执行,如果查询存在记录,则取出上次结果信息并反序列化为方法返回,返回调用方。
[0031]在上述步骤中,所述步骤2.1中假如在同一个流程中对于同一方法调用了两次,程序引入了第三个ThreadLocal变量callCountThreadLocal,此变量起到了计数器的作用,用于保存此线程每一个本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,包括如下步骤:步骤1:通过AOP切面表达式指定需要支持断点重试的方法并定义所有方法的OperationType;步骤2:在需要支持断点重试的业务流程中开启断点重试;步骤3:在发生异常后,持久化已经执行成功的方法返回值;步骤4:清空ThreadLocal变量,防止内存溢出。2.根据权利要求1所述的一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,所述步骤1具体包括:步骤1.1:借助AspectJ插件,通过其中的@PointCut注解来指定切面;步骤1.2:通过execution、@annotation函数名称进行匹配,或是通过args、@args方法参数进行匹配,或是通过within、target类名来进行匹配;步骤1.3:指定之后,AOP通过动态代理技术,对于所指定的方法进行环切,在方法执行前做重试的判断,或是在方法执行之后获取执行结果,并获取返回值。3.根据权利要求2所述的一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,在已经指定的方法中,如果想要支持忽略查询方法断点重试,需要在方法中加入此方法的操作类型注解@OperationType,反之则默认为更新交易。4.根据权利要求3所述的一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,如果为查询操作则指定@OperationType(value=“query”),如果为更新操作则指定@OperationType(value=“update”)。5.根据权利要求1所述的一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,所述步骤2具体包括:步骤2.1:对于业务流程F开启断点重试,只需要调用supportRetry()方法,其中如果重试标识为false,则是正常交易流程,进行正常逻辑处理;如果重试标识为true,则是重试交易流程,进行重试逻辑处理。6.根据权利要求5所述的一种基于AOP+ThreadLocal技术的分布式系统断点重试方法,其特征在于,所述步骤2.1中为正常交易交易,处理流程具体为:(1)程序将以上几个参数放入ThreadLocal变量inputThreadLocal;(2)在业务流程执行过程中,假设执行到方法m1,那么首先判断程序通过inputThreadLocal是否为空,如果为空,说明开启了断点重试,如果不为空则说明没有开启断点重试,如果开启了断点重试,那么从inputThreadLocal中获取当前线程的入参信息,判断重试处理标识;(3)判断重试处理标识是为false,则首先通过代理类执行实际方法,获取返回结果和返回值信息,判断结果为成功,则继续判断是否为查询交易,如果是忽略查询方法==true&&@OperationType(value=“query”),则不保存方法结果信息,否则将结果...

【专利技术属性】
技术研发人员:徐海洋
申请(专利权)人:四川新网银行股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1