2015-04-01 22:04 GMT+02:00 Romain Manni-Bucau <rmannibucau at gmail.com>:
>>> 2015-04-01 21:46 GMT+02:00 José Paumard <jose.paumard at gmail.com>:
>>> > What's your proposal? EJB API is quite nice to use and it integrates
>> smoothly with Future<>, not sure I get what's your issue is here.
>> EJB has me to write this kind of code :
>>>> return es.submit(myTask) ;
>>>>> this looks wrong, return new AsyncFuture<String>("i did it"); is what you
> should have written otherwise you just didnt use EJB async feature.
>
Hmm I dont think so. If I write
return new AsyncResult("Done in thread " +
Thread.currentThread().getName()) ; // returns a Future<String>
Then my code is not async at all, the get() call will just return my
parameter, and no other thread will be used in that process.
If I write :
return new executorService.submit(() -> "Done in thread " +
Thread.currentThread().getName()}) ;
Then I get an async call.
BTW if you check the source code of the AsyncResult class (with a nice typo
in it), its clearly written in it that it is not a real Future.
>>>> Because this is a synchronous call, that has to return a Future. But on
>> the other hand this is purely tehcnical code, that cant be put in the
>> framework, since one can call directly an EJB method. So the return type
>> has to be the one of the EJB method.
>>>> With events the situation is different. On the calling side, I write
>>>> completableFuture = event.fireAsync(payload) ; // type is
>> CompletionStage<probably void since there are many observers and an allOf
>> call>
>>>> On the observing side I can write :
>>>> public T observes(@Observes payload) { return t ; }
>>>> And the framework will take care of wrapping this t in a
>> CompletableFuture.allOf(...) with all the other observers to return it. So
>> I dont have to deal myself with the technical aspects of calling ES myself.
>> IMHO it leads to easier to write patterns.
>>>> Why T then? And actually your explanation is my proposal but a on purpose
> typing.
>>>>>> José
>>>>>>>> 2015-04-01 19:54 GMT+02:00 Romain Manni-Bucau <rmannibucau at gmail.com>:
>>>>>>>>>>> 2015-04-01 19:43 GMT+02:00 José Paumard <jose.paumard at gmail.com>:
>>>>>>> CompletionStage has a toCompletableFuture() method, that returns a
>>>> CompletableFuture. So there is no limitation in returning CompletionStage.
>>>> It could allow different implementation in the future than the only one we
>>>> have so far : CompletableFuture, since one can build a CompletableFuture
>>>> that wraps another implementation.
>>>>>>>>>>> +1, missed it
>>>>>>>>>> Problem with CF.allOf() and anyOf() is that they return resp. CF<Void>
>>>> and CF<Object>, which is not very API friendly.
>>>>>>>>>>> it is enough in enough cases IMO
>>>>>>>>>> Having the observers writers to provide his own implementation of
>>>> CompletableFuture is not that great imho. For the async EJB, all you can do
>>>> is return executorService.submit(myTask). I understand why the API
>>>> designers have chosen that, but I dont think it's that great. Correct me if
>>>> I'm wrong, but I think that we have the opportunity to move that burden
>>>> from the observers writers to the framework. And I think it would make the
>>>> API easier to use.
>>>>>>>>>>> What's your proposal? EJB API is quite nice to use and it integrates
>>> smoothly with Future<>, not sure I get what's your issue is here.
>>>>>>>>>> José
>>>>>>>>>>>> 2015-04-01 10:08 GMT+02:00 Romain Manni-Bucau <rmannibucau at gmail.com>:
>>>>>>>>> Hello Antoine,
>>>>>>>>>>>>>>> Romain Manni-Bucau
>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>>> <http://www.tomitribe.com>
>>>>>>>>>> 2015-04-01 9:55 GMT+02:00 Antoine Sabot-Durand <
>>>>>antoine at sabot-durand.net>:
>>>>>>>>>>> Hi Romain,
>>>>>>>>>>>> Intersting proposal. As I felt reading you that we misse the
>>>>>> CompletableFuture stuff in Java 8, I just repeat here that the agreed on
>>>>>> fireAsync signatures
>>>>>>>>>>>> <U extends T> CompletionStage<U> fireAsync(U event);
>>>>>> and
>>>>>> <U extends T> CompletionStage<U> fireAsync(U event, Executor
>>>>>> executor);
>>>>>>>>>>>> Yeah it’s CompletionStage because Jozef preferred using interfaces in
>>>>>> our API, but I guess implementation will use CompletableFuture under the
>>>>>> hood to avoid reinventing the wheel.
>>>>>>>>>>>>>>>>> This sounds "normal" but JVM doesn't follow it with its utility
>>>>> methods so basically today CompletionStage is super poor compared to
>>>>> CompletionFuture so I'm tempted to say the impl is preferred here. I didn't
>>>>> check what is the adoption of both in other framework, can validate or not
>>>>> my thought maybe.
>>>>>>>>>>>>>>>> With this approach your example:
>>>>>>>>>>>> event.fireAsync(new LetTheWorldKnow()).thenRun(() ->
>>>>>>> System.out.println("We did it!"));
>>>>>>>>>>>>>>>>>>> will work without adding constraint on observer signature.
>>>>>>>>>>>> Regarding the observer part, we already discuss similar approach. In
>>>>>> a former version of my async event doc I proposed using return type on
>>>>>> observer to do discrimination between async and sync and Mark made a
>>>>>> suggestion near yours during this meeting:
>>>>>>>>>>>>>>>>>>http://transcripts.jboss.org/meeting/irc.freenode.org/cdi-dev/2015/cdi-dev.2015-02-25-17.06.log.html>>>>>>>>>>>> (search for the first “signature” in text)
>>>>>>>>>>>> The main drawback of this approach is to let end user generate the
>>>>>> returned CompletableFuture. So each async observer should provide a way to
>>>>>> construct this completableFuture. The second question is the type param of
>>>>>> the returned CompletableFuture. Should we use raw type? Now we could
>>>>>> imagine helped to do that but...
>>>>>>>>>>>>>>>>> Exactly why I think this is a better solution. Cause it opens the door
>>>>> to asynchronism in a more elegant manner handling completion properly. I
>>>>> guess first impl will use allOf() combination but I see anyOf() - i fire to
>>>>> "notifiers" and I care only of 1 at least being called as a caller - and
>>>>> potentially other combinations other potentials needs we could cover in
>>>>> another spec (hopefully).
>>>>>>>>>> If async is just fire and forget we don't need fireAsync() but only
>>>>> fire() (void) and then observers are async or not which ensures compat at
>>>>> all levels since observers decide to be in the same context or not but I
>>>>> guess we don't want only fire and forget.
>>>>>>>>>> About creating a CompletableFuture we can do as in EJB spec and
>>>>> provide version to use by observer impl (javax.ejb.AsyncResult).
>>>>>>>>>>>>>>>> Don’t get me wrong, I’d love to find a solution based on this kind of
>>>>>> idea, but I fear it will add more complexity than double activation.
>>>>>>>>>>>> Antoine
>>>>>>>>>>>>>>>>>> Le 1 avr. 2015 à 09:15, Romain Manni-Bucau <rmannibucau at gmail.com> a
>>>>>> écrit :
>>>>>>>>>>>> No, fireAsync is still needed for all the reason we mzntionned -
>>>>>> strongest one being the fact we need a return type and cant change fire -
>>>>>> but using the return type we have the double activation without introducing
>>>>>> a new API. Said otherwise API stays natural on both sides which was my main
>>>>>> fear with a fireAsync and an @ObservesAsync (or any other new api we talked
>>>>>> about). And we have the bonus to be aligned on SE async which sounds quite
>>>>>> interesting for the future.
>>>>>> Le 1 avr. 2015 08:48, "Jozef Hartinger" <jharting at redhat.com> a
>>>>>> écrit :
>>>>>>>>>>>>> So instead of calling observers asynchronously you suggest turning
>>>>>>> observers into producers of CompletableFuture that will then be completed
>>>>>>> asynchronously?
>>>>>>>>>>>>>> On 03/31/2015 06:21 PM, Romain Manni-Bucau wrote:
>>>>>>>>>>>>>> // fire side
>>>>>>> event.fireAsync(new LetTheWorldKnow()).thenRun(() ->
>>>>>>> System.out.println("We did it!"));
>>>>>>>>>>>>>> // observer side
>>>>>>> CompletableFuture iWantToKnow(@Observes LetTheWorldKnow event) {}
>>>>>>>>>>>>>> // impl behavior would be like
>>>>>>> CompletableFuture.allOf(allObserverReturnedInstances) to be aligned on
>>>>>>> CompletableFuture behavior I think
>>>>>>>>>>>>>> Am I clearer?
>>>>>>>>>>>>>>>>>>>>>>>>>>>> Romain Manni-Bucau
>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>>>>>>> <http://rmannibucau.wordpress.com/> | Github
>>>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>>>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>>>>> <http://www.tomitribe.com/>
>>>>>>>>>>>>>> 2015-03-31 18:15 GMT+02:00 Sven Linstaedt <sven.linstaedt at gmail.com>
>>>>>>> :
>>>>>>>>>>>>>>> Hi Romain,
>>>>>>>>>>>>>>>> I am not sure, I have fully understand how an observer with CompletableFuture could
>>>>>>>> look like. Could you give us an example?
>>>>>>>>>>>>>>>> Afair CompletableFuture was considered to be used in the
>>>>>>>> "trigger" side in order to track async event invocation completion.
>>>>>>>>>>>>>>>> br, Sven
>>>>>>>>>>>>>>>> 2015-03-31 18:00 GMT+02:00 Romain Manni-Bucau <
>>>>>>>>rmannibucau at gmail.com>:
>>>>>>>>>>>>>>>>> Hi guys,
>>>>>>>>>>>>>>>>>> on async topic if I followed we are at the point where we are
>>>>>>>>> looking for an activation on the observer side.
>>>>>>>>>>>>>>>>>> Since Java 8 has now CompletableFuture it would be great to use
>>>>>>>>> it. Today the spec doesnt use observer returned values so it is mainly a
>>>>>>>>> bad practise to have one even if not strictly forbidden - BTW never saw it
>>>>>>>>> in real applications - plus spec is not compatible - not specified at all -
>>>>>>>>> with CompletableFuture since it is a new API so we can use it as a marker.
>>>>>>>>>>>>>>>>>> This is quite interesting for few reasons:
>>>>>>>>> 1- we have our double activation
>>>>>>>>> 2- API is user friendly (observer is async and has an async
>>>>>>>>> signature)
>>>>>>>>> 3- open door for future async enhancements (hopefully not in CDI)
>>>>>>>>> with composition of these observers
>>>>>>>>>>>>>>>>>>>>>>>>>>> Only point I'm not sure is should these observers support sync
>>>>>>>>> events. I don't see anything blocking to do it but can have missed
>>>>>>>>> something.
>>>>>>>>>>>>>>>>>>>>>>>>>>> wdyt?
>>>>>>>>>>>>>>>>>>>>>>>>>>> Romain Manni-Bucau
>>>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog
>>>>>>>>> <http://rmannibucau.wordpress.com/> | Github
>>>>>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>>>>>> <https://www.linkedin.com/in/rmannibucau> | Tomitriber
>>>>>>>>> <http://www.tomitribe.com/>
>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>>>>>> cdi-dev mailing list
>>>>>>>>>cdi-dev at lists.jboss.org>>>>>>>>>https://lists.jboss.org/mailman/listinfo/cdi-dev>>>>>>>>>>>>>>>>>> Note that for all code provided on this list, the provider
>>>>>>>>> licenses the code under the Apache License, Version 2 (
>>>>>>>>>http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>>>>>>>>> ideas provided on this list, the provider waives all patent and other
>>>>>>>>> intellectual property rights inherent in such information.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>>>> cdi-dev mailing listcdi-dev at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/cdi-dev
>>>>>>>>>>>>>> Note that for all code provided on this list, the provider licenses the code under the Apache License, Version 2 (http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas provided on this list, the provider waives all patent and other intellectual property rights inherent in such information.
>>>>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>>> cdi-dev mailing list
>>>>>>cdi-dev at lists.jboss.org>>>>>>https://lists.jboss.org/mailman/listinfo/cdi-dev>>>>>>>>>>>> Note that for all code provided on this list, the provider licenses
>>>>>> the code under the Apache License, Version 2 (
>>>>>>http://www.apache.org/licenses/LICENSE-2.0.html). For all other
>>>>>> ideas provided on this list, the provider waives all patent and other
>>>>>> intellectual property rights inherent in such information.
>>>>>>>>>>>>>>>>>>>>>>>>>>>> _______________________________________________
>>>>> cdi-dev mailing list
>>>>>cdi-dev at lists.jboss.org>>>>>https://lists.jboss.org/mailman/listinfo/cdi-dev>>>>>>>>>> Note that for all code provided on this list, the provider licenses
>>>>> the code under the Apache License, Version 2 (
>>>>>http://www.apache.org/licenses/LICENSE-2.0.html). For all other ideas
>>>>> provided on this list, the provider waives all patent and other
>>>>> intellectual property rights inherent in such information.
>>>>>>>>>>>>>>>>>>>>> --
>>>> Java le soir <http://blog.paumard.org> Cours Java en ligne
>>>> <http://blog.paumard.org/cours-tutoriaux/>
>>>> Twitter <http://twitter.com/#!/JosePaumard> Paris JUG
>>>> <http://www.parisjug.org> Devoxx France <http://www.devoxx.fr>
>>>> M : +33 6 76 82 91 47
>>>>>>>>>>>>>>>> --
>> Java le soir <http://blog.paumard.org> Cours Java en ligne
>> <http://blog.paumard.org/cours-tutoriaux/>
>> Twitter <http://twitter.com/#!/JosePaumard> Paris JUG
>> <http://www.parisjug.org> Devoxx France <http://www.devoxx.fr>
>> M : +33 6 76 82 91 47
>>>>
--
Java le soir <http://blog.paumard.org> Cours Java en ligne
<http://blog.paumard.org/cours-tutoriaux/>
Twitter <http://twitter.com/#!/JosePaumard> Paris JUG
<http://www.parisjug.org> Devoxx France <http://www.devoxx.fr>
M : +33 6 76 82 91 47
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/cdi-dev/attachments/20150401/1a2e0cea/attachment-0001.html