[cdi-dev] Async events. We need ideas to improve CDI-499
Jozef Hartinger
jharting at redhat.com
Wed Feb 11 03:58:34 EST 2015
Usually the observers are called from within the same thread as fire().
It may however not be the case always thus relying on modification of
non-thread-safe payload is probably a bad idea.
On 02/10/2015 11:51 AM, Antoine Sabot-Durand wrote:
> Jozef,
>
> One question. So today we have an async behaviour with transactional observer. What about event payload modification in these observer ?
>
> Antoine Sabot-Durand
>
>
>> Le 10 févr. 2015 à 11:40, Jozef Hartinger <jharting at redhat.com> a écrit :
>>
>> The way transactional observers are defined is that the observer method
>> is not called right away within the fire() call but instead is scheduled
>> to be executed in the corresponding transaction phase (e.g. using JTA's
>> Synchronization). This allows the fire() call to exit without waiting
>> for the observer to complete. Therefore, the transactional observer
>> notification is asynchronous. This has been the case since CDI 1.0 and
>> OWB should implement it that way too!
>>
>>> On 02/10/2015 10:53 AM, Mark Struberg wrote:
>>> purely technically: How do you manage to not spawn a new thread if you don't like to wait for the task to complete?
>>>
>>> Wonder how that would work...
>>>
>>> LieGrue,
>>> strub
>>>
>>>
>>>
>>>
>>>>> On Tuesday, 10 February 2015, 10:50, Jozef Hartinger <jharting at redhat.com> wrote:
>>>>> Async is not about a parallel thread. It is about fire() not waiting
>>>> until an observer finishes. Transactional observers are async already.
>>>> No need to make things more complicated by involving a "parallel
>>>> thread".
>>>>
>>>>
>>>>> On 02/10/2015 10:42 AM, Mark Struberg wrote:
>>>>> No they are not async in the sense that they get executed in a parallel
>>>> thread. That simply won't work. Think about
>>>> TransactionPhase.BEFORE_COMPLETION.
>>>>> There is a huge difference between 'it will get called on the same
>>>> thread but I have no control _when_' and 'it will get called on a
>>>> totally new thread'-
>>>>> For the TransactionPhase it is the first case imo.
>>>>>
>>>>> LieGrue,
>>>>> strub
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> On Tuesday, 10 February 2015, 10:30, Jozef Hartinger
>>>> <jharting at redhat.com> wrote:
>>>>>>> T ransactional observers are by definition async so they should
>>>> behave
>>>>>> the same no matter if fired with fire() or fireAsync().
>>>>>>
>>>>>>
>>>>>>> On 02/10/2015 09:13 AM, Mark Struberg wrote:
>>>>>>> Oh one more thing I found which is most probably broken or
>>>> totally changes
>>>>>> the behaviour
>>>>>>> 8.) All observers with transactionPhase != IN_PROGRESS
>>>>>>>
>>>>>>> LieGrue,
>>>>>>> strub
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> On Tuesday, 10 February 2015, 8:58, Mark Struberg
>>>>>> <struberg at yahoo.de> wrote:
>>>>>>>>> Hi José!
>>>>>>>> Backward compatibility is perfectly fine with both
>>>> approaches. People
>>>>>> can use
>>>>>>>> BeanManager#fire() instead of the newly proposed
>>>>>> BeanManager#fireAsync().
>>>>>>>> My point is that many people will simply not be able to use
>>>> fireAsync()
>>>>>> because
>>>>>>>> as a framework developer you really need to code defensive.
>>>> Without an
>>>>>> explicit
>>>>>>>> opt-in on observer side fireAsync() can basically only be
>>>> used in
>>>>>> situations
>>>>>>>> where you _exactly_ know all your observers...
>>>>>>>>
>>>>>>>> An No @Async annotation would also be nice as it could not
>>>> only be
>>>>>> used at
>>>>>>>> @Observes but also for @Event
>>>>>>>>
>>>>>>>> @Inject
>>>>>>>> @Async
>>>>>>>>
>>>>>>>> @Event
>>>>>>>>
>>>>>>>> private Event<UserLoggedIn> userLoggedInEventSource;
>>>>>>>>
>>>>>>>>
>>>>>>>> The benefit of an own @Async annotation over extending e.g.
>>>> the @Event
>>>>>>>> annotation is that it would be perfectly backward compatible.
>>>> This code
>>>>>> would
>>>>>>>> also run on CDI-1.0 .. 1.2 containers (as all annotations
>>>> which are not
>>>>>>>> available on the classpath will simply be ignored by the JVM.
>>>>>>>>
>>>>>>>> LieGrue,
>>>>>>>> strub
>>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> 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.
More information about the cdi-dev
mailing list