9

昔はThreadLocal、すべてのリクエスト処理がそのスレッドで行われ、Logback のようなものがこれを使用していたため、プログラムはリクエスト パスとともにデータを運ぶ必要がありましたMDC.put("requestId", getNewRequestId());

その後、Scala と関数型プログラミングが登場し、Futureが登場しましたLocal.scala(少なくとも twitterFutureにこのクラスがあることは知っています)。 /などのすべての機能を介してコンテキストをFuture.scala認識して転送し、多くのスレッドを通過した後でもダウンストリームにアクセスできるようにします。Local.scalamapflatMapLocal.set("requestId", getNewRequestId());Local.get(...)

CompletableFutureすっごく、私の質問はJavaです。新しいどこかLocalContextまたはいくつかのオブジェクト(名前がわからない)で同じことを行うことができますThreadLocalか?リクエストIDとthenApply、、などのすべてのログを失わないこと.Logback構成thenAcceptのロギングと-XrequestIdフラグで問題なく動作します。

編集:

例として。リクエストが来て、Log4j または Logback を使用している場合は、フィルターで設定MDC.put("requestId", requestId)し、アプリで次の行に多くのログ ステートメントを記録します。

log.info("request came in for url="+url);
log.info("request is complete");

これで、ログ出力に次のように表示されます。

INFO {time}: requestId425 request came in for url=/mypath
INFO {time}: requestId425 request is complete

これは、これを達成するために のトリックを使用していThreadLocalます。Twitter では、クラス Futureと共に Scala と Scala のTwitter を使用します。上記のシナリオを実現できるという点で 1 つに結び付けられていますが、これは非常に優れており、すべてのログ ステートメントでリクエスト ID をログに記録できるため、開発者はリクエスト ID をログに記録することを覚えておく必要がなく、単一の顧客のリクエスト応答サイクルを追跡できます。そのIDで。Local.scalaLocal.scalaFuture.scala

これはJavaでは見られません:(そのための多くのユースケースがあるため、これは非常に残念です.おそらく私が見ていないものがありますか?

4

2 に答える 2