Outbound Communication
Connectivity > Containers > JBoss Integration > Outbound Communication
Configuring a Session Bean to send messages to ActiveMQ Classic
In the attached example application, the three MDBs use the SenderEJB
to send JMS messages to an ActiveMQ Classic queue. In this example, I will be explaining how to:
- Configure and deploy an ActiveMQ Classic
Queue
to JBoss - Configure and deploy an ActiveMQ Classic
QueueConnectionFactory
to JBoss - Configure an EJB, deployed to JBoss, to reference the above two.
The Bean
In the ejb-jar.xml deployment descriptor, the SenderEJB
is declared as follows:
ejb-jar.xml – session bean declaration
<session>
...
<ejb-name>SenderEJB</ejb-name>
...
<ejb-class>com.panacya.platform.service.bus.sender.SenderBean</ejb-class>
...
<resource-ref>
<res-ref-name>jms/MyQueueConnectionFactory</res-ref-name>
<res-type>javax.jms.QueueConnectionFactory</res-type>
...
</resource-ref>
<message-destination-ref>
<message-destination-ref-name>jms/LogQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type>
...
<message-destination-link>LoggingQueue</message-destination-link>
</message-destination-ref>
</session>
The jms/MyQueueConnectionFactory
is the JNDI name the SenderEJB
will use to lookup a javax.jms.QueueConnectionFactory
. We will configure it to point to an ActiveMQ Classic QueueConnectionFactory
.
The jms/LogQueue
is the JNDI name the SenderEJB
will use to lookup the javax.jms.Queue
it will send messages to. We use the message-destination-link
element to refer to the LoggingQueue
which is declared in the assembly-descriptor
section of the ejb-jar.xml deployment descriptor as:
ejb-jar.xml – assembly descriptor section
<assembly-descriptor>
...
<message-destination>
<message-destination-name>LoggingQueue</message-destination-name>
</message-destination>
...
</assembly-descriptor>
This is a standard EJB deployment descriptor, nothing special.
The Connector
The resource-ref
element shown above, will be linked to the following element in the ra.xml file, which is contained within the activemq-ra-1.2.rar file:
ra.xml – The QueueConnectionFactory
<outbound-resourceadapter>
...
<connection-definition>
...
<connectionfactory-interface>javax.jms.QueueConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.activemq.ra.ActiveMQConnectionFactory</connectionfactory-impl-class>
<connection-interface>javax.jms.QueueConnection</connection-interface>
...
</connection-definition>
...
</outbound-resourceadapter>
The message-destination
element shown above, will be linked to the following element in the ra.xml file:
ra.xml – The Queue
<adminobject>
<adminobject-interface>javax.jms.Queue</adminobject-interface>
<adminobject-class>org.activemq.message.ActiveMQQueue</adminobject-class>
<config-property>
<config-property-name>PhysicalName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
</config-property>
</adminobject>
The Glue
In JBoss, connecting the resources needed by the ejb-jar.xml file to resources provided by the ra.xml file involves two additional files:
- panacya-jms-ds.xml - This is a JBoss data source file. It specifies which connector objects JBoss should instantiate and where in JNDI JBoss should place those objects.
- jboss.xml - This is a JBoss deployment descriptor which is contained within the panacya-mdb-test-1.0.jar file. It links resources needed by the EJBs to the JNDI names of resources available in JBoss.
panacya-jms-ds.xml – The JBoss Data Source File
This first snippet configures the QueueConnectionFactory
, declared above, and places it in JNDI at activemq/QueueConnectionFactory
:
panacya-jms-ds.xml – The QueueConnectionFactory
<tx-connection-factory>
<jndi-name>activemq/QueueConnectionFactory</jndi-name>
<xa-transaction/>
<rar-name>activemq-ra-1.2-SNAPSHOT.rar</rar-name>
<connection-definition>javax.jms.QueueConnectionFactory</connection-definition>
<security-domain-and-application>JmsXARealm</security-domain-and-application>
</tx-connection-factory>
This second snippet configures the Queue
, declared above, and places it in JNDI at activemq/queue/outbound
:
panacya-jms-ds.xml – The Queue
<mbean code="org.jboss.resource.deployment.AdminObject" name="activemq.queue:name=outboundQueue">
<attribute name="JNDIName">activemq/queue/outbound</attribute>
<depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='activemq-ra-1.2-SNAPSHOT.rar'</depends>
<attribute name="Type">javax.jms.Queue</attribute>
<attribute name="Properties">
PhysicalName=queue.outbound
</attribute>
</mbean>
In the panacya-jms-ds.xml file section shown above, the value of the Properties
element is set to PhysicalName=queue.outbound
. This value is the physical name of the ActiveMQ Classic destination the SenderEJB
will be sending messages to and not a JNDI name. In other words, the value of the PhysicalName
property has no meaning to JBoss. It is purely an ActiveMQ Classic setting.
jboss.xml – The JBoss Deployment Descriptor
This first snippet links the [jms/MyQueueConnectionFactory](JBoss Integration/outbound-communication)
JNDI name used by the SenderEJB
to the resource name queuefactoryref
which is local to the jboss.xml file:
jboss.xml – The QueueConnectionFactory for the SenderEJB
<enterprise-beans>
<session>
<ejb-name>SenderEJB</ejb-name>
<resource-ref>
<res-ref-name>jms/MyQueueConnectionFactory</res-ref-name>
<resource-name>queuefactoryref</resource-name>
</resource-ref>
</session>
...
</enterprise-beans>
This second snippet links the local queuefactoryref
name to the global JNDI name java:/activemq/QueueConnectionFactory
which was declared above:
jboss.xml – Linking queuefactoryref to the global JNDI namespace
<resource-managers>
<resource-manager>
<res-name>queuefactoryref</res-name>
<res-jndi-name>java:/activemq/QueueConnectionFactory</res-jndi-name>
</resource-manager>
...
</resource-managers>
This third snippet links the LoggingQueue
, which was declared in the assembly-descriptor
section of the ejb-jar.xml, to the global JNDI name activemq/queue/outbound
which was declared above:
jboss.xml – Linking LoggingQueue to the global JNDI namespace
<assembly-descriptor>
<message-destination>
<message-destination-name>LoggingQueue</message-destination-name>
<jndi-name>activemq/queue/outbound</jndi-name>
</message-destination>
</assembly-descriptor>
The above example highlights the key configuration settings needed to enable EJBs deployed in JBoss to send JMS messages to an ActiveMQ Classic destination.
You can try the above example, plus a few more, by downloading the activemq-jboss-test.zip file which contains the complete sample project.