我在我的play框架(带有akka)应用程序中使用rxjava observables(v 1.1.8)。我想知道是否有办法将MDC信息传播到rxjava Observables。我没有在我的日志语句中看到MDC信息,这些信息在Observable / Subscriber中打印出来。我理解rxJava使用单独的线程池,需要有一种机制将MDC信息从akka线程复制到rxjava线程。有解决方案吗?
仅供参考,在akka演员中我使用lightbends肉桂插件(http://developer.lightbend.com/docs/monitoring/latest/extensions/mdc.html)实现MDC传播
答案 0 :(得分:0)
正如您在链接中的Cinnamon文档中看到的那样,MDC实际上随着消息一起传播。 RxJava中没有等同的身份概念。另一方面,您可以自由定义用于RxJava操作的调度程序,并将MDC绑定到该调度程序控制的线程。
答案 1 :(得分:0)
即使此线程很旧,并且许多线程都已迁移到RxJava2,但以防万一有人想要实现:
对于RxJava1:
//client class
public class DemoApplication {
public static void main(String[] args) {
MDCContextForSchedulerHook.init();
// Above line should be before application run
// rest of the code ....
}
}
// WebHook class
import rx.functions.Action0;
import rx.plugins.RxJavaPlugins;
import rx.plugins.RxJavaSchedulersHook;
public class MDCContextForSchedulerHook extends RxJavaSchedulersHook {
@Override
public Action0 onSchedule(Action0 action) {
return super.onSchedule(new WrappedAction0(action));
}
public static void init() {
RxJavaPlugins.getInstance().registerSchedulersHook(new MDCContextSchedulerHook());
}
private static class WrappedAction0 implements Action0 {
private final Action0 actual;
private final MDCContext mdcContext;
public WrappedAction0(Action0 actual) {
this.actual = actual;
this.mdcContext = MDCContext.save();
}
@Override
public void call() {
mdcContext.restore();
actual.call();
}
}
}
对于RXJava 2:
引用this