[slf4j-dev] MDC works with twitter scala Future but not CompletableFuture

Dean Hiller dhiller at twitter.com
Thu Mar 22 15:40:13 CET 2018


and FYI, this was the list it was discussed on (MDC only works in futures
in scala not CompletableFutuers in java unless they fix
CompletableFuture)...(but perhaps I am not explaining it all correctly)...


Martin Buchholz <martinrb at google.com>,
Pavel Rappo <pavel.rappo at oracle.com>,
concurrency-interest <concurrency-interest at cs.oswego.edu>,
core-libs-dev <core-libs-dev at openjdk.java.net>

On Thu, Mar 22, 2018 at 8:38 AM, Dean Hiller <dhiller at twitter.com> wrote:

> unfortunately, there is no Local.java at this point BUT hopefully this
> stackoverflow question explains how MDC is broken across CompletableFuture
> but works fine for twitter Future
>
> https://stackoverflow.com/questions/37933713/does-
> completablefuture-have-a-corresponding-local-context
>
> NOTE: We swap the MDC with one depending on Local.scala instead of
> ThreadLocal(threadlocal breaks since many threads execute 1 request when
> using Future or CompletableFuture).
>
> thanks,
> Dean
>
>
> On Thu, Mar 22, 2018 at 8:18 AM, Ceki <ceki at qos.ch> wrote:
>
>>
>>
>> Hello Dean,
>>
>> What is Local.java ? Do you mean thread local? Please show an example of
>> what you would like to happen.
>>
>> Best regards,
>> --
>> Ceki
>>
>>
>>
>> On 22.03.2018 14:51, Dean Hiller wrote:
>>
>>> Has anyone requested the jdk to add Local.java to CompletableFuture.java
>>> so that context can be transferred through the .thenApply and .thenCompose
>>> methods.  ie. can we make MDC work in java-land with CompletableFutures?
>>> (it works in scala land with twitter scala Future by swapping the MDC out
>>> for the below thing I describe)
>>>
>>> let me go into more detail here.  We use twitter Future.scala which
>>> knows about Local.scala and Local.scala "acts" like a ThreadLocal.  I say
>>> acts because when you do future.map/flatMap(in java that is
>>> thenApply/thenCompose), it transfers the threadlocal through to the next
>>> executing function.
>>>
>>> soooo, long story short, in twitter servers, I can say
>>> MDC.put("requestId", someRequestId) and it works over the .map/.flatMap.
>>> This is not possible in java!!!!! ahhhhh....
>>>
>>> and I wrote a whole webserver in java with CompletableFutures before I
>>> found this out https://github.com/deanhiller/webpieces
>>>
>>> ps. their response was that it would be a global.  Sure, but I am
>>> practical and it solves a huge many platform problems like MDC, and some in
>>> my server where I don't know the customers code(and I had to hack around
>>> not having a Local type thing available :( ).
>>>
>>> Another reason they elude to is some methods they don't know how to
>>> handle Local in those cases(yup, well scala had the same thing but it
>>> managed to implement it because it was too important and now java is behind
>>> :( ).
>>>
>>> Anyways, it would be nice if others spoke up before they realize they
>>> need it for the MDC to keep working.
>>>
>>> thanks,
>>> Dean
>>>
>>>
>>>
>>> _______________________________________________
>>> slf4j-dev mailing list
>>> slf4j-dev at qos.ch
>>> http://mailman.qos.ch/mailman/listinfo/slf4j-dev
>>>
>>>
>> --
>> --
>> Ceki Gülcü
>> _______________________________________________
>> slf4j-dev mailing list
>> slf4j-dev at qos.ch
>> http://mailman.qos.ch/mailman/listinfo/slf4j-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.qos.ch/pipermail/slf4j-dev/attachments/20180322/4135eebb/attachment-0001.html>


More information about the slf4j-dev mailing list