1.默认情况下为 THRED
Hystirx调用的命令(注解保护的服务调用)都只在一个单独的线程池中运行(默认为Java线程池或为该Hystrix调用设置的线程池)是一个子线程,不与父线程共享彼此中独有数据
2.SEMAPHORE
由于@HystrixCommand注解保护不需要启动一个新线程(不明白),当线程调用超时,父线程中断,导致抛出无法捕获的异常,一般不用.
@HystirxCommand(
commandProperties={
@HystirxProperty=(name=“execution.isoation.strategy”,value=“SMEAPHORE”)})
但是当使用隔离级别为THRED是由于子父线程间无法共享(线程上下文)彼此数据,所以在调用下一级时无法将上级的数据传递给下一级.
解决方案:HystrixConcurrentStrategy-----可将Hystrix的父线程上下文传递到下级
实现方式
1.自定义HystrixConcurrentStrategy并发策略类继承默认策略类HystrixoncurrentStrategy,Hystrix只允许有一个并发策略类,但是spring cloud 允许将并发策略类链接,只需要将其插入到Hystrix并发策略配置信息中,重写父类所有方法,在wrapCallable方法中调用父类方法,传递一个已经实现callable接口的对象—已子类参数callable和保存上下文传递的数据的对象为构造参数
2.自定义一个实现Callable的类—执行线程上下文传播到Hystrix命令中
该类会在调用Hyxtrix保护的方法调用时创建,并调用call()方法
类的结构:
2.1构造方法初始化数据,
2.2重写call()方法
2.2.1实现数据传递到ThreadLocal中
2.2.2并调用父类的call(),调用之后会调用@HystrixCommand注解保护的方法
3.配置springcloud使用自定义Hystrix并发策略
定义一个配置类,将HrytrixConcurrentStrategy并发策略实现类重新到Hystrix插件中,且只能注册一个并发策略