在rxjava Observables中传播slf4j MDC(映射的诊断上下文)

时间:2017-07-25 07:25:40

标签: playframework akka rx-java slf4j

我在我的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传播

2 个答案:

答案 0 :(得分:0)

正如您在链接中的Cinnamon文档中看到的那样,MDC实际上随着消息一起传播。 RxJava中没有等同的身份概念。另一方面,您可以自由定义用于RxJava操作的调度程序,并将MDC绑定到该调度程序控制的线程。

答案 1 :(得分:0)

即使此线程很旧,并且许多线程都已迁移到RxJava2,但以防万一有人想要实现:

对于RxJava1:

Source


//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