For an overview of the original proposal, please review 
https://issues.jboss.org/browse/SEAMJMS-3
https://issues.jboss.org/browse/SEAMJMS-4

Why are we doing this?

The issue raised recently on the list is that during AfterBeanDiscovery, there 
is no guarantee that beans are available.  This conflicts with the Egress side 
of the feature where the full observer method must be created during ABD.  As a 
result, we cannot guarantee that looking up beans will work (in fact, we can 
typically guarantee it won't work).  Therefor, we can not support generic 
qualifiers on the destinations that are involved in the mapping, the extension 
needs to be able to resolve the destination manually.

As a result, I am proposing a shorter, more defined API that will define the 
same type of interface level observer definitions, but have certain annotation 
requirements.  There will continue to be no class level requirements for 
interfaces.  Any class level annotations will be ignored.

public void methodName(@Observes @SomeQualifier MyObject obj, 
@JmsDestination(jndiName="jms/SomeQueue") Queue q);

This defines that an event fired of type MyObject qualified SomeQualifier will 
be sent to the queue at jms/SomeQueue.  Then, messages received of 
jms/SomeQueue that can be cast to MyObject get fired under the same qualifier.  
You can have any number of arguments that are extensions of Destination (Queue 
& Topic).  In addition, argument order is not taken into account.  You can 
define your destinations in any order.  JmsDestination is a Seam JMS provided 
annotation.

The second supported style uses @Resource.  Note that there is a current issue 
with JBoss Meta that requires a limitation of the interface.  
https://issues.jboss.org/browse/JBMETA-328 . 

@Resource(mappedName="jms/SomeTopic")
@SomeQualifier
public MyObject methodName();

Arguments to the method are optional, and are ignored.  The functional behavior 
of this mapping is the exact same as the prior.  In addition, JmsDestination 
can replace Resource in this case.

In both of these examples, you can add in @RouteType(Routing.INGRESS) or 
@RouteType(Routing.EGRESS).  If either of these are present, then only the 
listed routing type will be created (ingress for in bound messages on 
queues/topics, egress for outbound events to queues/topics).

I hope that this is clear enough for all, but it's what I believe we can 
accomplish near term and still provide a concrete API to develop against that 
will work consistently across platforms.

John
_______________________________________________
seam-dev mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/seam-dev

Reply via email to