[cdi-dev] JMS 2.1: Proposal to allow any CDI managed bean in a Java EE application to listen for JMS messages

Romain Manni-Bucau rmannibucau at gmail.com
Thu Aug 27 12:03:55 EDT 2015

2015-08-27 18:00 GMT+02:00 Nigel Deakin <nigel.deakin at oracle.com>:

> On 27/08/2015 16:35, Romain Manni-Bucau wrote:
>> 2015-08-27 17:31 GMT+02:00 Nigel Deakin <nigel.deakin at oracle.com <mailto:
>> nigel.deakin at oracle.com>>:
>>     On 26/08/2015 10:16, Romain Manni-Bucau wrote:
>>         The sample I gave before with the JmsStart event basically:
>>         public class JmsRegistrar {
>>               @Inject
>>               @JmsConnectionFactory(...)
>>               private ConnectionFactory factory;
>>               @Inject
>>               @JmsQueue(...)
>>               private Queue queue;
>>               public void startJms(@Observes JmsStart start) {
>>                   start.withFactory(factory) // withFactory should be
>> optional if only 1 bean matches it
>>                          .register(MyCdiTypedListener.class) // with
>> defaults for all potential config
>>                              .listenOn(queue)
>>                          .register(MyCdiTypedListener2.class, new
>> MyLiteral())
>>                               .withMaxSessions(10)
>>                               .listenOn(Queue.class, new
>> QueueLiteral(...))
>>                               ......;
>>               }
>>         }
>>         The power of it appears when you have a config injection in
>> JmsRegistrar you can iterate over to get the list of
>>         listener for instance.
>>         Also JMS resources can be decorated and referenced from
>> qualifiers instead of instances thanks to CDI.
>>         It doesnt prevent the app to use @JmxListener somewhere else if
>> the listener doesnt need any input/config to be
>>         registered.
>>     I'm trying to understand this. Are you suggesting that
>>     1. When the application is started an event of type JmsStart is
>> fired. This class will be defined by JMS and
>>     implemented by the application server.
>>     2. The application defines a class (in this example called
>> JmsRegistrar). This has a method startJms which receives
>>     the event.
>>     3. JmsStart (the event class) has several builder methods. The most
>> important of these is register() which you can
>>     use to specify the class of a listener. The other methods
>> withFactory, register, withMaxSession and listenOn specify
>>     things like which connection factory is used, which queue is used and
>> so on.
>>     This doesn't look very different from the normal JMS API, except that
>> it uses a builder pattern and is triggered
>>     automatically at startup. Apart from triggering the initial event,
>> what is CDI doing for you here?
>> Yes this is it, few details important for CDI:
>> 1- ensure JMS is CDI ready - ie dont use it before the start event, if
>> JMS uses @Initialized(ApplicationScoped) then the
>> app cant use it for instance, same using extension
>> AfterValidationDeployment etc...so this event is just to ensure we
>> dont use "JMS CDI" too early
>> 2- JMS can use contextual instances implicitely which is not the case in
>> SE
>> otherwise you are right the API is just fluent compared to what is
>> already there - found it nicer to expose but this
>> point is maybe personal.
> OK. I'm interested in your statement "JMS can use contextual instances
> implicitly". That suggests that the method
> register(MyCdiTypedListener.class) would use some CDI API such as
> Instance.get() to obtain an instance of MyCdiTypedListener rather than
> simply using new. Is that right?
it would do a lookup in CDI context - using the bean manager most probably.
It also means to retrieve the JMS components linked (connection factory,
Destination?....) it can do a lookup as well and do the wiring if not
ambiguous. Very good point about it is it makes default resource optional -
and then makes CDI integration more SE friendly and avoids the pain to rely
on a default resource you can't suppose anything about excepted it is there.

> What I can't see yet is how to pass in the configuration parameters for
> specifying things like the queue. These are not qualifiers which are used
> by Instance.select() to determine which class is instantiated. They are
> values which are used by the bean's postConstruct method (as extended by
> the portable extension) to initialise the bean.
Options are IMO:

- get actual instance, at this point in CDI lifecycle you can get them
injected if you want or create them manually if you desire
- use a jms qualifier to find them

Having both makes sense if a jms qualifier is added.

> Nigel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/cdi-dev/attachments/20150827/58295f77/attachment.html 

More information about the cdi-dev mailing list