昔はThreadLocal
、すべてのリクエスト処理がそのスレッドで行われ、Logback のようなものがこれを使用していたため、プログラムはリクエスト パスとともにデータを運ぶ必要がありましたMDC.put("requestId", getNewRequestId());
その後、Scala と関数型プログラミングが登場し、Future
が登場しましたLocal.scala
(少なくとも twitterFuture
にこのクラスがあることは知っています)。 /などのすべての機能を介してコンテキストをFuture.scala
認識して転送し、多くのスレッドを通過した後でもダウンストリームにアクセスできるようにします。Local.scala
map
flatMap
Local.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.scala
Local.scala
Future.scala
これはJavaでは見られません:(そのための多くのユースケースがあるため、これは非常に残念です.おそらく私が見ていないものがありますか?