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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 迭代器Python_python迭代器使用

    迭代器Python_python迭代器使用迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。可迭代对象我们已经知道可以对l

    2022年8月6日
  • 网路层协议——IGMP协议「建议收藏」

    网路层协议——IGMP协议「建议收藏」一、组播地址1、IP多播的基本概念①IP多播(以前曾译为组播)已成为互联网的一个热门课题。目的:更好地支持一对多通信,网络中的带宽压力。●一对多通信:一个源点发送到许多个终点。例如,实时信息的交付(如新闻、股市行情等),软件更新,交互式会议及其他多媒体通信。2、组播IP地址的特点①它使用D类IP地址作为目的地址。②组播数据包不产生ICMP差错报文。③组播地址只能用于目的地址而不能用于源地址。3、组播MAC地址…

    2022年9月14日
  • 其实就是为了能有字幕特效,用MeGUI + AVS压制PSP MP4AVC视频01 – 基础知识篇

    其实就是为了能有字幕特效,用MeGUI + AVS压制PSP MP4AVC视频01 – 基础知识篇A、需要准备的软件: .netframework2.0运行库(下面两个软件都是.net写的)MeGUI(AVS等软件的集合GUI)LiteMP4Tool(批处理AVS转换的GUI)通用解码器包,能够播放各类视频文件即可,包括K-LiteCodec、完美解码甚至暴风影音(这个不推荐)之类。avisynth2.58,这个我自己用的完美解码附…

    2022年10月16日
  • Android悬浮窗的实现

    Android悬浮窗的实现*本篇文章已授权微信公众号guolin_blog(郭霖)独家发布现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以及探索一下实现悬浮窗时的易错点。

    2022年7月17日
  • 一个经典例子让你彻彻底底理解java回调机制是什么_java实现回调函数

    一个经典例子让你彻彻底底理解java回调机制是什么_java实现回调函数以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:ClassA实现接口CallBackcallback

    2022年11月2日
  • make wildcard_其在古文中的用法

    make wildcard_其在古文中的用法
    在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效。这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcardPATTERN…)。在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。
    一般我们可以使用“$(wildcard*.c)”来获取工作

    2022年10月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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