跨线程时共享数据
程序员文章站
2022-03-09 09:51:48
...
在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变量。
任务执行时,先保存子线程现有的HystrixRequestContext变量,再赋值主线程的HystrixRequestContext变量,任务执行完成后,重新还原子线程。
如果不想使用Hystrix这种方式实现,也可以使用Hystrix提供的插件方式重新包装task,通过实现HystrixConcurrencyStrategy类,重写wrapCallable方法,和Hystrix的实现原理类似。
比如提供一个继承ThreadLocal的XXXThreadLocal类,那么业务方在使用时,就可以这样使用。
ThreadLocal name = new XXXThreadLocal();
name.set("占小狼");
这种方式看起来对已有逻辑只有一点小小的改动,对于新接入的也不那么陌生。
作者:占小狼
链接:https://www.jianshu.com/p/c60fe209a799
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
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变量。
任务执行时,先保存子线程现有的HystrixRequestContext变量,再赋值主线程的HystrixRequestContext变量,任务执行完成后,重新还原子线程。
如果不想使用Hystrix这种方式实现,也可以使用Hystrix提供的插件方式重新包装task,通过实现HystrixConcurrencyStrategy类,重写wrapCallable方法,和Hystrix的实现原理类似。
比如提供一个继承ThreadLocal的XXXThreadLocal类,那么业务方在使用时,就可以这样使用。
ThreadLocal name = new XXXThreadLocal();
name.set("占小狼");
这种方式看起来对已有逻辑只有一点小小的改动,对于新接入的也不那么陌生。
作者:占小狼
链接:https://www.jianshu.com/p/c60fe209a799
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
上一篇: 跨线程时共享数据
下一篇: 正向代理:即隐藏用户IP