Seam makes it easy to send and receive JMS messages to and from Seam components.
To configure Seam's infrastructure for sending JMS messages, you need to tell Seam about any topics and queues you want to send messages to, and also tell Seam where to find the QueueConnectionFactory and/or TopicConnectionFactory.
Seam defaults to using UIL2ConnectionFactory which is the usual connection factory for use with JBossMQ. If you are using some other JMS provider, you need to set one or both of queueConnection.queueConnectionFactoryJndiName and topicConnection.topicConnectionFactoryJndiName in seam.properties, web.xml or components.xml.
You also need to list topics and queues in components.xml to install a Seam managed TopicPublishers and QueueSenders:
<component name="stockTickerPublisher" class="org.jboss.seam.jms.ManagedTopicPublisher"> <property name="topicJndiName">topic/stockTickerTopic</property> </component> <component name="paymentQueueSender" class="org.jboss.seam.jms.ManagedQueueSender"> <property name="queueJndiName">queue/paymentQueue</property> </component>
Now, you can inject a JMS TopicPublisher and TopicSession into any component:
@In(create=true) private transient TopicPublisher stockTickerPublisher; @In(create=true) private transient TopicSession topicSession; public void publish(StockPrice price) { try { topicPublisher.publish( topicSession.createObjectMessage(price) ); } catch (Exception ex) { throw new RuntimeException(ex); } }
Or, for working with a queue:
@In(create=true) private transient QueueSender paymentQueueSender; @In(create=true) private transient QueueSession queueSession; public void publish(Payment payment) { try { paymentQueueSender.publish( queueSession.createObjectMessage(payment) ); } catch (Exception ex) { throw new RuntimeException(ex); } }
You can process messages using any EJB3 message driven bean. Message-driven beans may even be Seam components, in which case it is possible to inject other event and application scoped Seam components.