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

Hmily 源码解析 (三) —— himly事务上下文目录1.HmilyTransactionContexthimly事务上下文,在一个线程内只有唯一实例。在线程内时不时的需要获取事务的id及角色状态等信息。如果作为参数在函数中传递并不合适,并且由于切面,拦截器等等编程方式也无法依靠该方式获取所需要的信息。hmily采用的方式是将所需要的信息封装为一个实体,这个实体就是HmilyTransactionContext。并将HmilyTr…

大家好,又见面了,我是你们的朋友全栈君。


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
  • 清除线程内的事务上下文。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143377.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号