我想使用Hystrix(1.5.12)与在Vert.X(3.3.3)中运行的RxJava(1.3.3)进行折叠。我遇到的问题是没有为请求缓存密钥的线程设置Hystrix请求上下文。
我在请求进入时创建Hystrix请求上下文,并将此上下文作为参数传递给所有创建observable的类。
在创建的collapser上创建HystrixObservableCollapser
实现并调用toObservable()
的类将在某个Vert.X事件循环线程上调用。
上面返回的observable的订阅可能在也可能不在collapser创建的线程上。此订阅线程与请求所在的线程不同,并且创建了Hystrix请求上下文。因此,没有为订阅线程设置Hystrix请求上下文。
我已经阅读了HystrixRequestContext in case of async requests和其他问题,我已经尝试了许多RxJava和Hystrix钩子,但它们似乎都没有工作:
RxJavaHooks#setOnScheduleAction
HystrixConcurrencyStrategy#wrapCallable
RxJavaHooks#setOnComputationScheduler
在HystrixContextScheduler
(以及其他2个调度程序挂钩)中包装RxJava调度程序。当我在传递给collapser返回的observable的doOnSubscribe(...)
的lambda中设置Hystrix请求上下文时,事情开始对以下钩子起作用了:
RxJavaHooks#setOnScheduleAction
RxJavaHooks#setOnComputationScheduler
(以及其他2个调度程序挂钩)中包装RxJava调度程序。是否为collapser返回的observable的doOnSubscribe(...)
中的当前线程设置Hystrix请求上下文,并使用上面2个钩子中的1个,设置Hystrix请求上下文的正确方法?
如果是这样,哪个钩子是首选方法?
如果没有,如何正确确保为线程设置Hystrix请求上下文?
答案 0 :(得分:0)
我没有将此标记为答案,因为我并非100%确定这是正确的方法。但这对我有用。
我正在使用RxJava调度程序钩子,并结合崩溃者返回的observable上的doOnSubscribe(...)
。