Hystrix系列之ThreadLocal跨线程传递问题

栏目: 服务器 · 发布时间: 7年前

内容简介:在Hystrix系列之前的文章中提到过,如果使用线程池模式,那么存在一个ThreadLocal变量跨线程传递的问题,即在主线程的ThreadLocal变量,无法在线程池中使用,不过Hystrix内部提供了解决方案,但是个人觉得这个方案不是那么友好。在Hystrix中,如果想在跨线程时共享数据,必须通过其实在用法上,和

在Hystrix系列之前的文章中提到过,如果使用线程池模式,那么存在一个ThreadLocal变量跨线程传递的问题,即在主线程的ThreadLocal变量,无法在线程池中使用,不过Hystrix内部提供了解决方案,但是个人觉得这个方案不是那么友好。

解决方案

在Hystrix中,如果想在跨线程时共享数据,必须通过 HystrixRequestVariableDefault 申明变量

HystrixRequestVariableDefault name = new HystrixRequestVariableDefault();
name.set("占小狼");

其实在用法上,和 ThreadLocal 是一样的,只是需要对现有代码的大量改造。

看下这个方案的实现原理,先从 set 开始。

public void set(T value) {
  HystrixRequestContext.getContextForCurrentThread().state.put(this, new LazyInitializer<T>(this, value));
}

Hystrix内部通过 HystrixRequestContext 实现数据的跨线程传递, getContextForCurrentThread 得到的是当前线程的 HystrixRequestContext 对象,每个 HystrixRequestContext 对象都有一个对应 ConcurrentHashMap 变量 state ,负责保存通过 HystrixRequestVariableDefault 初始化的数据。

通过 set 方法,该对象和数据会被保存在一个当前线程所属的map中。为了实现数据的跨线程传递,只需要在初始化task的时候,把主线程的 HystrixRequestContext 变量保存起来,在task执行的时候,重新赋值到子线程的上下文中,这样在子线程中就可以顺利拿到这些数据。

Hystrix中通过 HystrixContextCallable 包装原始 Callable ,并使用 parentThreadState 保存了当前线程的 HystrixRequestContext 变量。

Hystrix系列之ThreadLocal跨线程传递问题

任务执行时,先保存子线程现有的 HystrixRequestContext 变量,再赋值主线程的 HystrixRequestContext 变量,任务执行完成后,重新还原子线程。

如果不想使用Hystrix这种方式实现,也可以使用Hystrix提供的插件方式重新包装task,通过实现 HystrixConcurrencyStrategy 类,重写 wrapCallable 方法,和Hystrix的实现原理类似。

比如提供一个继承 ThreadLocalXXXThreadLocal 类,那么业务方在使用时,就可以这样使用。

ThreadLocal name = new XXXThreadLocal();
name.set("占小狼");

这种方式看起来对已有逻辑只有一点小小的改动,对于新接入的也不那么陌生。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

引爆用户增长

引爆用户增长

黄天文 / 机械工业出版社 / 2017-11-1 / 79.00

本书是用户增长领域的开创性著作,是作者在去哪儿、360、百度等知名企业多年用户增长工作的经验总结。宏观层面,从战略高度构建了一套系统的、科学的用户增长方法论;微观层面,从战术执行细节上针对用户增长体系搭建、用户全生命周期运营等总结了大量能引爆用户增长的实操方法和技巧。 不仅有方法论和技巧,而且非常注重实操。对电商、团购、共享经济、互联网金融等4大行业的50余家企业(360、美团、滴滴等)的1......一起来看看 《引爆用户增长》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具