2015-02-23 18 views
8

Những gì tôi muốn làm là bản chất những gì How to use MDC with thread pools? được yêu cầu, nhưng với Netty.Sử dụng org.slf4j.MDC với kênh Netty?

Tôi muốn thông tin MDC liên quan đến mỗi Channel. Có những lựa chọn nào cho Netty? Nếu tôi cần phải đặt lại MDC theo cách thủ công, tôi có thể sử dụng phương pháp nào để thực hiện điều này từ một nơi?

Trả lời

1

Hãy xem mdedetrich/mdc-async-netty-eventloopgroup dự án trên GitHub. Về cơ bản, bạn phải trang trí 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

Giải pháp này không hoạt động. Nó cũng có một "ảnh chụp nhanh" của bản đồ ngữ cảnh của chuỗi gọi là MDCEventLoopGroup.fromThread(), và theo dõi tất cả các thay đổi trong tương lai của nó, chuyển ảnh chụp nhanh này tới tất cả các runnables. Tuy nhiên, nó vẫn không hoạt động ngay cả trên môi trường đa lõi đa luồng. Tôi đã cố gắng sửa đổi nó, tôi đã cố gắng cũng ghi đè lên các phương thức submit (...) và schedule ... (...), và cũng ghi đè lên phương thức newChild (...) để tạo ra một đứa trẻ với exec overridden (...), gửi (...) và lịch biểu ... (...) phương pháp không thành công - ngữ cảnh vẫn bị mất. – Uniqus

Các vấn đề liên quan