2015-02-23 12 views

Antwort

1

Werfen Sie einen Blick auf mdedetrich/mdc-async-netty-eventloopgroup Projekt auf GitHub. Grundsätzlich müssen Sie dekorieren EventLoopGroup.execute

@Override 
public void execute(Runnable runnable) { 
    delegate.execute(new Runnable() { 
     @Override 
     public void run() { 
      Map<String, String> oldMdcContext = MDC.getCopyOfContextMap(); 
      setContextMap(mdcContext); 
      try { 
       runnable.run(); 
      } finally { 
       setContextMap(oldMdcContext); 
      } 

     } 
    }); 
} 

private void setContextMap(Map<String, String> context) { 
    if (context == null) { 
     MDC.clear(); 
    } else { 
     MDC.setContextMap(context); 
    } 
} 
+0

Diese Lösung funktioniert nicht. Es nimmt auch einen "Schnappschuss" der Kontextabbildung des Threads auf, der MDCEventLoopGroup.fromThread() aufruft, und verliert alle zukünftigen Änderungen davon, indem er diesen Snapshot an alle Runnables übergibt. Und trotzdem funktioniert es in einer Multithread-Multicore-Umgebung immer noch nicht. Ich habe versucht, es zu modifizieren, ich habe versucht, auch die Methoden submit (...) und schedule ... (...) zu überschreiben und auch die Methode newChild (...) zu überschreiben, die ein Kind mit überschriebener exec erzeugt (...)), sende (...) und plane ... (...) Methoden ohne Erfolg - der Kontext ist noch verloren. – Uniqus