Hat CompletableFuture einen entsprechenden lokalen Kontext?

n früheren Zeiten hatten wir ThreadLocal für Programme, um Daten zusammen mit dem Anforderungspfad zu transportieren, da die gesamte Anforderungsverarbeitung für diesen Thread durchgeführt wurde und solche Dinge wie Logback dies mit MDC.put ("requestId", getNewRequestId ()) verwendete

Dann kamen Scala und Functional Programming und Futures und mit ihnen auch Local.scala (zumindest weiß ich, dass die Twitter Futures diese Klasse haben). Future.scala kennt Local.scala und überträgt den Kontext über alle Funktionen von map / flatMap usw. usw., sodass ich Local.set ("requestId", getNewRequestId ()) ausführen kann. und dann stromabwärts, nachdem es über viele Threads gereist ist, kann ich immer noch mit Local.get darauf zugreifen (...)

Soooo, meine Frage ist in Java, kann ich dasselbe mit der neuen CompletableFuture irgendwo mit LocalContext oder einem Objekt (dessen Name nicht sicher ist) tun und auf diese Weise den MDC-Kontext für die Rückmeldung ändern, um ihn stattdessen in diesem Kontext zu speichern eines ThreadLocal, so dass ich die Anforderungs-ID nicht verliere und alle meine Protokolle über thenApply, thenAccept usw. usw. immer noch gut mit der Protokollierung und dem Flag -XrequestId in der Rückmeldungskonfiguration funktionieren

BEARBEITEN

Als Beispiel. Wenn eine Anfrage eingeht und Sie log4j oder logback verwenden, legen Sie in einem Filter MDC.put ("requestId", requestId) fest und protokollieren dann in Ihrer App viele Protokollanweisungen

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

Now, in der Protokollausgabe wird @ angezei

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

Dies erreicht man mit einem ThreadLocal-Trick. Bei Twitter verwenden wir scala und twitter Futures in scala zusammen mit einer Local.scala-Klasse. Local.scala und Future.scala sind insofern miteinander verbunden, als wir das obige Szenario erreichen können, das immer noch sehr gut ist. Alle unsere Protokollanweisungen können die Anforderungs-ID protokollieren, sodass der Entwickler sich niemals daran erinnern muss, die Anforderungs-ID zu protokollieren, und Sie können nachverfolgen Ein einzelner Kundenanforderungs-Antwortzyklus mit dieser ID.

Ich sehe das nicht in Java :(, was sehr bedauerlich ist, da es viele Anwendungsfälle dafür gibt. Vielleicht gibt es etwas, das ich aber nicht sehe?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage