-
Java 8의 parallelStream 을 사용할때 Log4j 의 MDC 문제 해결하기JAVA 2017. 3. 13. 14:52반응형
log4j 의 MDC 에 대한 설명을 보면, 위의 그림처럼 thread safe 한 것으로 되어 있다. 하지만, java 의 forkJoin 을 사용하게 될 경우, thread safe 가 보장되지 않는다.
java 8 의 parallelStream 을 사용할 경우, 내부적으로 forkJoin 을 통한 처리를 하고 있어, 동일한 현상이 발생한다.이 현상을 방지 하기 위해서는 아래와 같이 MDC 의 현재 contextMap 을 복사하고, 그 값을 사용하도록 셋팅하는 클래스 하나가 필요 하다.123456789101112131415161718192021import org.slf4j.MDC;import java.util.Map;public class MdcSnapshot {private final Map<String, String> mdc;private MdcSnapshot() {this.mdc = MDC.getCopyOfContextMap();}public static MdcSnapshot getCurrentMdc() {return new MdcSnapshot();}public void populateMdc() {MDC.clear();if (mdc != null) {MDC.setContextMap(mdc);}}}cs 만들어진 클래스의 사용법은 아래와 같다.1234567private void doThingsReallyFast(List<Thing> things) {MdcSnapshot context = MdcSnapshot.getCurrentMdc();things.parallelStream().forEach((thing) -> {context.populateMdc();doTheThing(thing);});}cs 반응형'JAVA' 카테고리의 다른 글
Object Pool 에 대한 간략한 설명 (0) 2017.09.27 람다 표현식을 사용한 잠금(lock) 관리 (0) 2017.03.17 구글에서 오픈소스로 공개한 자연어 처리 기술 (0) 2016.05.13 Apache Struts2 보안취약점 (0) 2016.04.27 node.js 및 python 등의 서버 스크립트 언어의 eval 취약점 (0) 2015.04.15