设置Hystrix的请求上下文与在Vert.X中运行的RxJava折叠

时间:2018-02-18 20:14:24

标签: rx-java hystrix

我想使用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#setOnComputationSchedulerHystrixContextScheduler(以及其他2个调度程序挂钩)中包装RxJava调度程序。

当我在传递给collapser返回的observable的doOnSubscribe(...)的lambda中设置Hystrix请求上下文时,事情开始对以下钩子起作用了:

  • RxJavaHooks#setOnScheduleAction
  • RxJavaHooks#setOnComputationScheduler(以及其他2个调度程序挂钩)中包装RxJava调度程序。

是否为collapser返回的observable的doOnSubscribe(...)中的当前线程设置Hystrix请求上下文,并使用上面2个钩子中的1个,设置Hystrix请求上下文的正确方法?

如果是这样,哪个钩子是首选方法?

如果没有,如何正确确保为线程设置Hystrix请求上下文?

1 个答案:

答案 0 :(得分:0)

我没有将此标记为答案,因为我并非100%确定这是正确的方法。但这对我有用。

我正在使用RxJava调度程序钩子,并结合崩溃者返回的observable上的doOnSubscribe(...)