Hmily 源码解析 (三) —— himly事务上下文


1. HmilyTransactionContext
  • himly事务上下文在一个线程内只有唯一实例
  • 在线程内时不时的需要获取事务的id及角色状态等信息。如果作为参数在函数中传递并不合适,并且由于切面,拦截器等等编程方式也无法依靠该方式获取所需要的信息。hmily采用的方式是将所需要的信息封装为一个实体,这个实体就是HmilyTransactionContext。并将HmilyTransactionContext存储在ThreadLocal<>中,保证每个线程隔离唯一。
  • HmilyTransactionContext中的属性是HmilyTransaction属性的冗余,按理说直接使用HmilyTransaction类就可以,但是单独把部分属性冗余出来一个HmilyTransactionContext类的原因是为什么?我认为原因有二:一、这里的作用是作为线程内的上下文,单独建一个类有利于清晰代码结构。二、HmilyTransactionContext内的属性(action,role)还是业务流转中的判断状态,并且还会根据需要被修改某种中间状态(然后又修改回来),可以说HmilyTransactionContext的属性虽然是HmilyTransaction的子集,但是(action,role)属性在HmilyTransactionContext下的实际值域却大于在HmilyTransaction中的实际值域,说起来很绕口,总结起来就是一句话HmilyTransactionContext要承担的某些作用同HmilyTransaction类的定位无关,所以单独建立一个HmilyTransactionContext类
属性说明
  1. transId
  • 事务id。同HmilyTransaction的transId,作用是绑定为线程唯一,一个线程内至多只会有一个himly事务。
  1. action
  • 流转状态。值域为HmilyActionEnum枚举类型。 同HmilyTransaction的status属性的值域相同。
  1. role
  • 角色。值域为HmilyRoleEnum枚举类型。角色的作用比较复杂,简单来说,在通过切面时,会根据角色的不同选择执行不同的代码,起到分流的作用。并在适当的时候修改角色值,以保证下次进入切面时执行相应的代码。

2. HmilyTransactionContextLocal

  • 事务上下文管理类。采用单例的设计模式,全局唯一。实例内部维护一个ThreadLocal实例属性。在线程间隔离,保证每一个线程内部至多只有一个HmilyTransactionContext(事务上下文)实例。
  • ThreadLocal(线程本地变量),是java.lang包提供的一个类。这是HmilyTransactionContextLocal类的核心。具体作用是该实例内部可以维护我们定义的一个泛型实例(这里就是HmilyTransactionContext类),并且为每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量而不会出现共享的问题。更具体的就不详述了。
属性
  1. CURRENT_LOCAL
  • 线程本地变量,用于为每一个线程都存储一个独立的HmilyTransactionContext实例副本,存储在CURRENT_LOCAL中保证每一个线程至多只有一个事务上下文。
  1. TRANSACTION_CONTEXT_LOCAL
  • 唯一的HmilyTransactionContextLocal实例。由于HmilyTransactionContextLocal是全局单例所以能保证CURRENT_LOCAL全局唯一,从而保证每一个线程至多只有一个事务上下文。
方法
  1. 构造方法HmilyTransactionContextLocal
  • 通过构造方法私有化保证单例模式。
  1. getInstance
  • 提供给外界获取HmilyTransactionContextLocal实例。
  1. set
  • 为线程添加事务上下文
  1. get
  • 获取该线程的的事务上下文。(这里的操作并不会删除CURRENT_LOCAL内的数据)
  1. remove
  • 清除线程内的事务上下文。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值