[webbeans-dev] Re: Distributed event channels
Scott Ferguson
ferg at caucho.com
Thu Jan 15 15:16:26 EST 2009
On Jan 15, 2009, at 5:42 AM, Gavin King wrote:
> OK, after thinking this through over the last couple of days I've come
> to the conclusion that we can live with something slightly less
> general. The usecase for this stuff is really state synchronization
> and therefore N-of-N semantics is the only thing that makes sense, and
> supporting guaranteed delivery sounds to me like total overkill.
Is it possible to reuse the @Asynchronous annotation from EJB 3.1 with
the exact same semantics? They seem essentially the same to me, and
having a shared definition for that aspect would be fantastic
(especially from a documentation perspective.) Having two very-
similar but different annotations may be hard to keep track of. Plus
the current EJB definition is more complete.
-- Scott
>
>
> Of course, if you guys think it's important, it's not hard add support
> for 1-of-N semantics and for persistent (guaranteed) events, but I
> really don't think it's something we need to do in 1.0.
>
> So the attached draft adds:
>
> * asynchronous event observers
> * topic mapped events
> * a definition of the tx, security and web beans contexts for all
> kinds of observers
>
> Take a look at 8.5.7-8.5.9 and 8.8, and let me know if you think
> something is missing or wrong.
>
> Thanks!
>
> On Sun, Dec 21, 2008 at 6:51 PM, Gavin King <gavin at hibernate.org>
> wrote:
>> IBM has raised the issue of event processing in a distributed
>> environment, and we (Red Hat) have promised to address this issue in
>> the revised public draft.
>>
>> The Web Beans event bus provides a very nice way for stateful
>> components to synchronize their state (transactionally) with changes
>> that take place in the application. Event processing is *much* more
>> important in an environment with stateful object such as SFSBs than
>> it
>> is in an environment with only stateless objects such as SLSBs or
>> Spring beans. Furthermore, event processing must be aware of the
>> transaction completion lifecycle (many applications today have bugs
>> when transaction rollbacks occur). Therefore, I believe that event
>> processing is an essential feature of Web Beans.
>>
>> However, the event bus we have today is a purely local construct and
>> does not help when the application is distributed across multiple
>> cluster nodes or multiple physical tiers.
>>
>> Designing a distributed event bus would potentially be a very
>> difficult undertaking, with so many issues to think about: QoS,
>> asynchronicity, transactionality, routing, etc. Fortunately, JMS
>> already has the features we need, and is what is sometimes used today
>> to solve the problems we're talking about:
>>
>> * asynchronous, distributed semantics
>> * a notion of both 1-of-N and N-of-N semantics (queues and topics)
>> * a notion of logical channels (to allow routing of events between
>> tiers and applications)
>> * support for a range of QoS semantics
>> * transactionality
>>
>> Furthermore, JMS is well-understood and well-supported.
>>
>> If the spec simply defines that events were distributed via JMS,
>> absolutely nothing would stop vendors from also supporting
>> alternative
>> distribution mechanisms as proprietary extensions (for example, in
>> JBoss we could provide support for JGroups).
>>
>> And when EE finally gets a WorkManager API, a future version of Web
>> Beans could also define that distribution of local asynchronous
>> events
>> is via the WorkManager.
>>
>> The application developer would not be exposed to the JMS APIs. The
>> actual interaction with JMS would be handled by the container. All
>> the
>> developer would need to do is specify that events with a specific
>> type
>> and binding types would be distributed by a certain queue or topic.
>> (web-beans.xml would be the right place to specify this mapping.)
>>
>> What I'm thinking is the following:
>>
>> (1) Event observers may specify that they receive events
>> asynchronously:
>>
>> void invalidateCache(@Observes @Asynchronously @Created Product
>> product) { ... }
>>
>> or even:
>>
>> void invalidateCache(@Observes(ASYNCHRONOUSLY) @Created Product
>> product) { ... }
>>
>> By default, an asynchronous observer is a purely local construct.
>> However, unlike synchronous observers, an asynchronous observer is
>> called in a different set of web beans contexts to the contexts in
>> which the event was fired.
>>
>> (2) A topic or queue declaration may specify a set of events which
>> are
>> distributed via that queue/topic:
>>
>> <Topic>
>> <destination>java:comp/env/jms/CacheInvalidationEvents</
>> destination>
>> <connectionFactory>java:comp/env/jms/
>> TopicConnectionFactory</connectionFactory>
>> <events>
>> <myapp:Product>
>> <myapp:Created/>
>> </myapp:Product>
>> </events>
>> </Topic>
>>
>> This declaration means that any event that is "assignable" to the
>> specified type and binding types is a distributed event, distributed
>> by the named JMS topic.
>>
>> (3) The Web Bean manager would validate that all observers for any
>> event distributed via JMS are declared to be asynchronous observers,
>> and throw an exception if there are any synchronous observers for the
>> event.
>>
>> (4) We need to think carefully about the concept of an asynchronous
>> transaction completion event observer. The following combinations are
>> semantically correct, and need to be supported, even for the
>> distributed
>> case:
>>
>> @Observes @Asynchronously @AfterTransactionCompletion
>> @Observes @Asynchronously @AfterTransactionSuccess
>> @Observes @Asynchronously @AfterTransactionFailue
>>
>> However, this combination is not meaningful:
>>
>> @Observes @Asynchronously @BeforeTransactionCompletion
>>
>> (5) Finally, since JMS is a transactional medium, we could support a
>> further setting which writes the event transactionally to the queue/
>> topic.
>> However, this setting needs to be a global setting for the event
>> type.
>> Perhaps an @Transactional annotation for the event type?
>>
>> WDYT?
>>
>
>
>
> --
> Gavin King
> gavin.king at gmail.com
> http://in.relation.to/Bloggers/Gavin
> http://hibernate.org
> http://seamframework.org
> <Web Beans 20090116.pdf>
More information about the weld-dev
mailing list