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)


相关推荐

  • xsync集群分发脚本的改良[通俗易懂]

    xsync集群分发脚本的改良[通俗易懂]集群分发脚本xsync带多参数1.0增强了一下带参个数xsync1.0#!/bin/bash#校验参数pcount=$#if(($pcount==0))then exitfi#获取用户名user=`whoami`#获取文件名,路径for((i=1;i<=$#;i++))#对多个传参进行分析dob=${!i} #这里用到了“间接变量”语法fname=`basename$b`dname=`dirname$b`dir=`cd$dname;pwd`

  • C++数组初始化[通俗易懂]

    C++数组初始化[通俗易懂]C++数组初始化定义:int*pia=newint[10];// arrayof10uninitialized ints此 new 表达式分配了一个含有10个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia。在自由存储区中创建的数组对象是没有名字的,只能通过其地址间接地访问堆中的对象。注意:C++使用new和delete…

  • 3分钟告诉你如何成为一名黑客?|零基础到黑客入门指南,你只需要掌握这五点能力

    3分钟告诉你如何成为一名黑客?|零基础到黑客入门指南,你只需要掌握这五点能力三分钟带各位揭秘黑客究竟是什么,以及想要成为黑客都需要具备哪些能力?

  • Java判断回文字符串_java将字符串反转输出

    Java判断回文字符串_java将字符串反转输出java判断回文字符串几种简单的实现:1.将字符串倒置后逐一比较,实现如下:publicclassHuiWenTest{/***@SERLIN*/publicstaticvoidmain(String[]args){Stringstr=””;System.out.println(“请输入一个字符串”);Scannerin

  • 科里奥利力的方向

    判断参考系转动的角速度方向根据右手定则,从上往下看,四指绕着物体转动方向,拇指指向的方向为角速度的方向。科里奥利力向上:科里奥利力向下:向量外积大小:a×b=|a||b|sin<a,b>=c方向:从向量a绕到向量b形成的轨迹运用右手定则(同上),拇指指向为c的方向。科里奥利力的方向根据F=2mν×ω科里奥利力的方向由物体的速度指向参考系的角速度,假设上图a…

  • 86_比特币冷钱包实现思路

    86_比特币冷钱包实现思路引言2015年的羊年新年假期,中国最大的竞争币交易所之一的比特儿传出冷钱包被盗的新闻,7170个比特币被黑客瞬间偷走,损失超过1000万元人民币。大家不禁要问,比特币都放进冷钱包了还会被偷走,这比特币还能玩吗?这不靠谱啊!比特儿交易所老总在之后的媒体采访中几次强调,“密码被激活成功教程”,冷钱包和密码有很大关系吗?还是这位老总根本不知道何为冷钱包。引用Okcoin创始人徐明星的一句话来…

发表回复

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

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