Есть ли у CompletableFuture соответствующий локальный контекст?

В прежние времена у нас был ThreadLocal для программ для переноса данных вместе с путем запроса, поскольку вся обработка запроса выполнялась в этом потоке, и такие вещи, как logback, использовали это с MDC.put ("requestId", getNewRequestId ());

Затем пришли scala и функциональное программирование, появился Futures, и вместе с ними появился Local.scala (по крайней мере, я знаю, что у Twitter Futures есть этот класс). Future.scala знает о Local.scala и передает контекст через все функции map / flatMap и т. Д. И т. Д., Так что я все еще могу делать Local.set ("requestId", getNewRequestId ()); и затем вниз по течению после того, как он прошел через много потоков, я все еще могу получить к нему доступ с помощью Local.get (...)

Soooo, мой вопрос в Java, могу ли я сделать то же самое с новым CompletableFuture где-нибудь с LocalContext или некоторым объектом (не уверен в имени), и таким образом, я могу изменить контекст MDC logback, чтобы сохранить его в этом контексте вместо ThreadLocal таким образом, что я не теряю идентификатор запроса и все мои журналы через thenApply, thenAccept и т. д. и т. д., все еще прекрасно работают с журналированием и флагом -XrequestId в конфигурации logback

РЕДАКТИРОВАТЬ:

В качестве примера. Если у вас есть запрос и вы используете 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 для достижения этой цели. В твиттере мы используем scala и twitter Futures в scala вместе с классом Local.scala. Local.scala и Future.scala связаны между собой тем, что мы можем достичь описанного выше сценария, что очень приятно, и все наши операторы log могут регистрировать идентификатор запроса, поэтому разработчику никогда не придется запоминать идентификатор запроса, и вы можете проследить через один цикл запроса клиентов с этим идентификатором.

Я не вижу этого в java :(, что очень прискорбно, поскольку есть много вариантов использования для этого. Возможно, есть что-то, чего я не вижу, хотя?

Ответы на вопрос(1)

Ваш ответ на вопрос