2016-12-27 2 views
1

여러 레이어, 서비스 및 구성 요소가있는 거대한 모노 리체를 인수해야했습니다.디자인 실패, MDC 악용

내가 코드를 살펴 보았을 때 가장 먼저 깨닫는 건 MDC입니다.

일부 예 :

public void setContextOrderId(String orderId) { 
    MDC.put("orderId", orderId); 
} 

또는

String sessionId = MDC.get("sessionId"); 

MDC

는 응용 프로그램에서 정적의 HashMap으로 사용, 나는 동기 MDC가 가로 질러 요청에 따라 사용할 수 있다는 사실에 기인 믿습니다 요청 파이프 라인 및 저장소로 사용되었습니다.

대체 방법은 무엇입니까? thread safe container에 대한 대안이 있습니까?

감사합니다.

답변

1

오 마이. 누군가 MDC를 사용하여 데이터를 저장했습니다. "학대"가 올바른 용어입니다.

정확한 해결책은 정확히 무엇이 사용되는지에 달려 있습니다. 예를 들어 Spring과 같은 것을 실행한다면 request-scope beans와 같은 것이 될 것입니다.

기술적으로 대부분의 "요청 범위"솔루션은 ThreadLocal을 사용합니다. MDCThreadLocal을 사용합니다.

그런 식으로 리팩터링 할 경우 다른 범위 (요청, 세션, 응용 프로그램 등)를 존중하는 일부 종속성 주입 컨테이너의 방향으로 이동하려고합니다. MDC을 자신의 ThreadLocal 기반 저장소로 바꾼다면 많이 이기지 않을 것입니다.

+0

왜 MDC가 저장 장치로 사용되는지 왜 저를 괴롭 힙니다. MDC에서 데이터의 모든 비트를 놓고 읽습니다. – DarthVader