| <div class="wiki-content maincontent"> |
| |
| |
| <h2 id="OutboundCommunication-INLINEConfiguringaSessionBeantosendmessagestoActiveMQ">Configuring a Session Bean to send messages to ActiveMQ</h2> |
| <p>In the attached <a shape="rect" href="outbound-communication.data/activemq-jboss-test.zip?version=3&modificationDate=1117021355000&api=v2" data-linked-resource-id="3278" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="activemq-jboss-test.zip" data-nice-type="Zip Archive" data-linked-resource-content-type="application/zip" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">example application</a>, the three MDBs use the <code>SenderEJB</code> to send JMS messages to an ActiveMQ queue. In this example, I will be explaining how to:</p> |
| <ol><li>Configure and deploy an ActiveMQ <code>Queue</code> to JBoss</li><li>Configure and deploy an ActiveMQ <code>QueueConnectionFactory</code> to JBoss</li><li>Configure an EJB, deployed to JBoss, to reference the above two.</li></ol> |
| |
| |
| <h3 id="OutboundCommunication-TheBean">The Bean</h3> |
| <p>In the <a shape="rect" href="outbound-communication.data/ejb-jar.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3249" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="ejb-jar.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">ejb-jar.xml</a> deployment descriptor, the <code>SenderEJB</code> is declared as follows:<br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-ejbSenderEJB"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ejb-jar.xml – session bean declaration</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <p>The <code>jms/MyQueueConnectionFactory</code> is the JNDI name the <code>SenderEJB</code> will use to lookup a <code>javax.jms.QueueConnectionFactory</code>. We will configure it to point to an ActiveMQ <code>QueueConnectionFactory</code>.</p> |
| |
| <p>The <code>jms/LogQueue</code> is the JNDI name the <code>SenderEJB</code> will use to lookup the <code>javax.jms.Queue</code> it will send messages to. We use the <code>message-destination-link</code> element to refer to the <code>LoggingQueue</code> which is declared in the <code>assembly-descriptor</code> section of the <a shape="rect" href="outbound-communication.data/ejb-jar.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3249" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="ejb-jar.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">ejb-jar.xml</a> deployment descriptor as: <br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-ejbLoggingQueue"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ejb-jar.xml – assembly descriptor section</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <assembly-descriptor> |
| ... |
| <message-destination> |
| <message-destination-name>LoggingQueue</message-destination-name> |
| </message-destination> |
| ... |
| </assembly-descriptor> |
| ]]></script> |
| </div></div> |
| |
| <p>This is a standard EJB deployment descriptor, nothing special. </p> |
| |
| <h3 id="OutboundCommunication-TheConnector">The Connector</h3> |
| <p>The <code>resource-ref</code> element <a shape="rect" href="#OutboundCommunication-ejbSenderEJB">shown above</a>, will be linked to the following element in the <a shape="rect" class="external-link" href="http://activemq.codehaus.org/checkout/activemq/modules/ra/src/rar/META-INF/ra.xml" rel="nofollow">ra.xml</a> file, which is contained within the <a shape="rect" href="jboss-integration.xml#JBossIntegration-rarfile">activemq-ra-1.2.rar</a> file:<br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-raQueueConnectionFactory"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ra.xml – The QueueConnectionFactory</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <p>The <code>message-destination</code> element <a shape="rect" href="#OutboundCommunication-ejbLoggingQueue">shown above</a>, will be linked to the following element in the <a shape="rect" class="external-link" href="http://activemq.codehaus.org/checkout/activemq/modules/ra/src/rar/META-INF/ra.xml" rel="nofollow">ra.xml</a> file:<br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-raQueue"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>ra.xml – The Queue</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <h3 id="OutboundCommunication-TheGlue">The Glue</h3> |
| <p>In JBoss, connecting the resources needed by the <a shape="rect" href="outbound-communication.data/ejb-jar.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3249" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="ejb-jar.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">ejb-jar.xml</a> file to resources provided by the <a shape="rect" class="external-link" href="http://activemq.codehaus.org/checkout/activemq/modules/ra/src/rar/META-INF/ra.xml" rel="nofollow">ra.xml</a> file involves two additional files:</p> |
| <ol><li><strong><a shape="rect" href="outbound-communication.data/panacya-jms-ds.xml?version=5&modificationDate=1117021448000&api=v2" data-linked-resource-id="3271" data-linked-resource-version="5" data-linked-resource-type="attachment" data-linked-resource-default-alias="panacya-jms-ds.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">panacya-jms-ds.xml</a></strong> - This is a JBoss data source file. It specifies which connector objects JBoss should instantiate and where in JNDI JBoss should place those objects.</li><li><strong><a shape="rect" href="outbound-communication.data/jboss.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3251" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="jboss.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">jboss.xml</a></strong> - This is a JBoss deployment descriptor which is contained within the <a shape="rect" href="jboss-integration.xml#JBossIntegration-ejbjarfile">panacya-mdb-test-1.0.jar</a> file. It links resources needed by the EJBs to the JNDI names of resources available in JBoss.</li></ol> |
| |
| |
| <h5 id="OutboundCommunication-panacya-jms-ds.xml–TheJBossDataSourceFile"><a shape="rect" href="outbound-communication.data/panacya-jms-ds.xml?version=5&modificationDate=1117021448000&api=v2" data-linked-resource-id="3271" data-linked-resource-version="5" data-linked-resource-type="attachment" data-linked-resource-default-alias="panacya-jms-ds.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">panacya-jms-ds.xml</a> – <em>The JBoss Data Source File</em></h5> |
| <p>This first snippet configures the <code>QueueConnectionFactory</code>, <a shape="rect" href="#OutboundCommunication-raQueueConnectionFactory">declared above</a>, and places it in JNDI at <code>activemq/QueueConnectionFactory</code>:<br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-dsQueueConnectionFactory"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>panacya-jms-ds.xml – The QueueConnectionFactory</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <p>This second snippet configures the <code>Queue</code>, <a shape="rect" href="#OutboundCommunication-raQueue">declared above</a>, and places it in JNDI at <code>activemq/queue/outbound</code>:<br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-dsQueue"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>panacya-jms-ds.xml – The Queue</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <p>In the <a shape="rect" href="outbound-communication.data/panacya-jms-ds.xml?version=5&modificationDate=1117021448000&api=v2" data-linked-resource-id="3271" data-linked-resource-version="5" data-linked-resource-type="attachment" data-linked-resource-default-alias="panacya-jms-ds.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">panacya-jms-ds.xml</a> file section shown above, the value of the <code>Properties</code> element is set to <code>PhysicalName=queue.outbound</code>. This value is the physical name of the ActiveMQ destination the <code>SenderEJB</code> will be sending messages to and not a JNDI name. In other words, the value of the <code>PhysicalName</code> property has no meaning to JBoss. It is purely an ActiveMQ setting. </p> |
| |
| <h5 id="OutboundCommunication-jboss.xml–TheJBossDeploymentDescriptor"><a shape="rect" href="outbound-communication.data/jboss.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3251" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="jboss.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">jboss.xml</a> – <em>The JBoss Deployment Descriptor</em></h5> |
| <p>This first snippet links the <code><a shape="rect" href="#OutboundCommunication-ejbSenderEJB">jms/MyQueueConnectionFactory</a></code> JNDI name used by the <code>SenderEJB</code> to the resource name <code>queuefactoryref</code> which is local to the <a shape="rect" href="outbound-communication.data/jboss.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3251" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="jboss.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">jboss.xml</a> file: <br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-jbossQueuefactoryref"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>jboss.xml – The QueueConnectionFactory for the SenderEJB</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <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> |
| ]]></script> |
| </div></div> |
| |
| <p>This second snippet links the local <code>queuefactoryref</code> name to the global JNDI name <code>java:/activemq/QueueConnectionFactory</code> which was <a shape="rect" href="#OutboundCommunication-dsQueueConnectionFactory">declared above</a>: <br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-jbossQueueConnectionFactory"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>jboss.xml – Linking queuefactoryref to the global JNDI namespace</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <resource-managers> |
| <resource-manager> |
| <res-name>queuefactoryref</res-name> |
| <res-jndi-name>java:/activemq/QueueConnectionFactory</res-jndi-name> |
| </resource-manager> |
| ... |
| </resource-managers> |
| ]]></script> |
| </div></div> |
| |
| <p>This third snippet links the <code>LoggingQueue</code>, which was <a shape="rect" href="#OutboundCommunication-ejbLoggingQueue">declared</a> in the <code>assembly-descriptor</code> section of the <a shape="rect" href="outbound-communication.data/ejb-jar.xml?version=3&modificationDate=1117021488000&api=v2" data-linked-resource-id="3249" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="ejb-jar.xml" data-nice-type="XML File" data-linked-resource-content-type="text/xml" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">ejb-jar.xml</a>, to the global JNDI name <code>activemq/queue/outbound</code> which was <a shape="rect" href="#OutboundCommunication-dsQueue">declared above</a>: <br clear="none"> |
| <span class="confluence-anchor-link" id="OutboundCommunication-jbossQueue"></span></p> |
| <div class="code panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>jboss.xml – Linking LoggingQueue to the global JNDI namespace</b></div><div class="codeContent panelContent pdl"> |
| <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ |
| <assembly-descriptor> |
| <message-destination> |
| <message-destination-name>LoggingQueue</message-destination-name> |
| <jndi-name>activemq/queue/outbound</jndi-name> |
| </message-destination> |
| </assembly-descriptor> |
| ]]></script> |
| </div></div> |
| |
| <p>The above example highlights the key configuration settings needed to enable EJBs deployed in JBoss to send JMS messages to an ActiveMQ destination. </p> |
| |
| <p>You can try the above example, plus a few more, by downloading the <a shape="rect" href="outbound-communication.data/activemq-jboss-test.zip?version=3&modificationDate=1117021355000&api=v2" data-linked-resource-id="3278" data-linked-resource-version="3" data-linked-resource-type="attachment" data-linked-resource-default-alias="activemq-jboss-test.zip" data-nice-type="Zip Archive" data-linked-resource-content-type="application/zip" data-linked-resource-container-id="35943" data-linked-resource-container-version="53">activemq-jboss-test.zip</a> file which contains the complete sample project.</p></div> |
| |