2016-12-27 6 views
1

私はいくつかのレイヤー、サービス、コンポーネントを持つ巨大なモノリスを引き継がなければなりませんでした。デザインが失敗し、MDCの濫用

私がコードを歩いているうちに、私が気づいた最初のことは、MDCの使用です。

いくつかの例は:MDCは、アプリ間での静的のHashMapとして使用されている

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

または

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

、私は動機がMDCは全体の要求ごとに利用可能であるという事実によるものだった信じて要求パイプラインとそれはストレージとして使用されました。

どのように置き換えることができますか?スレッドセーフなコンテナの代替手段はありますか?

ありがとうございました。

答えて

1

Oh my。誰かがMDCを使ってデータを保存していました。ここでは「虐待」が正しい用語です。

正確な解決方法は、正確に何が使用されているかによって異なります。たとえば、Springのようなものを実行すると、おそらくrequest-scope beansのようなものになるでしょう。

技術的には、ほとんどの「リクエストスコープ」ソリューションはThreadLocalをフードの下で使用します。 MDCThreadLocalを使用します。

リファクタリングをしたいと思うなら、春やそれ以外のものであれば、さまざまなスコープ(リクエスト、セッション、アプリケーションなど)を尊重する依存性注入コンテナの方向に移動しようとします。 MDCを自分のThreadLocalベースのストレージに置き換えただけでは、あまり勝てません。

+0

MDCがストレージに使用されている理由はわかりません。すべてのビットのデータがMDCからすべて読み込まれて読み込まれます。 – DarthVader

関連する問題