<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<body link="#355491" alink="#4262a1" vlink="#355491" style="background: #e2e2e2; margin: 0; padding: 20px;">

<div>
        <table cellpadding="0" bgcolor="#FFFFFF" border="0" cellspacing="0" style="border: 1px solid #dadada; margin-bottom: 30px; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                <tbody>
                        <tr>

                                <td>

                                        <table border="0" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" style="border: solid 2px #ccc; background: #dadada; width: 100%; -moz-border-radius: 6px; -webkit-border-radius: 6px;">
                                                <tbody>
                                                        <tr>
                                                                <td bgcolor="#000000" valign="middle" height="58px" style="border-bottom: 1px solid #ccc; padding: 20px; -moz-border-radius-topleft: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 5px; -webkit-border-top-left-radius: 5px;">
                                                                        <h1 style="color: #333333; font: bold 22px Arial, Helvetica, sans-serif; margin: 0; display: block !important;">
                                                                        <!-- To have a header image/logo replace the name below with your img tag -->
                                                                        <!-- Email clients will render the images when the message is read so any image -->
                                                                        <!-- must be made available on a public server, so that all recipients can load the image. -->
                                                                        <a href="https://community.jboss.org/index.jspa" style="text-decoration: none; color: #E1E1E1">JBoss Community</a></h1>
                                                                </td>

                                                        </tr>
                                                        <tr>
                                                                <td bgcolor="#FFFFFF" style="font: normal 12px Arial, Helvetica, sans-serif; color:#333333; padding: 20px;  -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 5px; -webkit-border-bottom-left-radius: 5px;"><h3 style="margin: 10px 0 5px; font-size: 17px; font-weight: normal;">
    JBoss7 integration with Tibco EMS using 'Generic JMS RA'
</h3>
<span style="margin-bottom: 10px;">
    modified by <a href="https://community.jboss.org/people/ykravchenko">Yevgen Kravchenko</a> in <i>JBoss Messaging</i> - <a href="https://community.jboss.org/docs/DOC-47346">View the full document</a>
</span>
<hr style="margin: 20px 0; border: none; background-color: #dadada; height: 1px;">

<div class="jive-rendered-content"><div style="color: #c09853; background-color: #fcf8e3; border: 1px solid #FBEED5; border-radius: 4px; padding: 10px;"><strong>Warning!</strong> This solution might not be perfect, it's not fully tested so please use it on your own risk.</div><h3>Introduction</h3><p>In turned out that old approaches to integrate Jboss with Tibco EMS (for example <a class="jive-link-wiki-small" href="https://community.jboss.org/docs/DOC-14734">this one</a>) will not work for Jboss7. Now we need to use vendor provided Resource adapter (RA), but TibcoEMS is not providing one, what should we do? There is a number of forum threads (for example <a class="jive-link-message-small" href="https://community.jboss.org/message/730006#730006">here</a>) requesting Jboss7 /Tibco EMS integration but none of them is giving a complete set of steps to follow.</p><p>In this article I'm going to share some ideas on how to configure Jboss7 to work with Tibco messaging.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><h3>Generic JMS resource adapter</h3><p>TibcoEMS is not providing resource adapter that we could use to integrate with Jboss7, that leaves us no choice but write our own Resource adapter. That is bright idea and will definitely work better then what will follow next, but creating custom RA is time consuming task. Instead of reinventing the wheel we could use <a class="jive-link-external-small" href="http://genericjmsra.java.net/">Generic JMS resource adapter</a>.</p><p>However downloading generic resource adapter and deploying it to Jboss7 will not work, you'll most certainly fail with errors stated<a class="" href="https://community.jboss.org/message/759055#759055?tstart=0"> here</a>. So you'll have to update generic jms ra alittle.</p><h4>Generic JMS RA project checkout</h4><p>To checkout source code please follow this <a class="jive-link-external-small" href="http://java.net/projects/genericjmsra/sources">link</a>, if you don't want to update source yourself you could skip next parts of article and download updated genericra.rar from attachments.</p><p>Steps to configure ANT properties to build project are described <a class="jive-link-external-small" href="http://java.net/projects/genericjmsra/sources/svn/content/trunk/README.build.txt">here</a>.</p><h4>Fixing deployment errors</h4><p>When deploying genericra.rar to Jboss7 you'll get 2 errors:</p><pre class="jive-pre"><code class="jive-code jive-java">Description: An AdminObject must implement javax.resource.Referenceable and java.io.Serializable interfaces <font color="navy"><b>if</b></font> javax.resource.spi.ResourceAdapterAssociation is implemented Code
Code: com.sun.genericra.outbound.QueueProxy
</code></pre><p>and </p><pre class="jive-pre"><code class="jive-code jive-java">Description: An AdminObject must implement javax.resource.Referenceable and java.io.Serializable interfaces <font color="navy"><b>if</b></font> javax.resource.spi.ResourceAdapterAssociation is implemented Code
Code: com.sun.genericra.outbound.TopicProxy
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>The easiest fix you need to do - force 2 classes implement required interfaces. This is the example of QueueProxy that I came up with</p><pre class="jive-pre"><code class="jive-code jive-java"><font color="navy"><b>public</b></font> <font color="navy"><b>class</b></font> QueueProxy <font color="navy"><b>extends</b></font> DestinationAdapter <font color="navy"><b>implements</b></font> javax.jms.Queue, Referenceable, Serializable <font color="navy">{</font>
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="darkgreen">/* The rest of the code is skipped. This is what I've added in order for QueueProxy to be Referenceable*/</font> 
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>private</b></font> Reference reference;
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> setReference(Reference reference) <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.reference = reference;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>public</b></font> Reference getReference() <font color="navy"><b>throws</b></font> NamingException <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>return</b></font> reference;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Same should be done with TopicProxy as well. After this changes genericra.rar will deploy with no errors to Jboss7.</p><h4>Updating Generic JMS RA config</h4><p>Next we need to change SupportsXA config property in ra.xml (genericra.rar/META-INF). It will cause an issue if you want to use it. In default config it's String while in Java code this property is Boolean. So we need to change from:</p><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;config-property&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;config-property-name&gt;</span>SupportsXA<span class="jive-xml-tag">&lt;/config-property-name&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;config-property-type&gt;</span>java.lang.String<span class="jive-xml-tag">&lt;/config-property-type&gt;</span>
<span class="jive-xml-tag">&lt;/config-property&gt;</span>
</code></pre><p>to:</p><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;config-property&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;config-property-name&gt;</span>SupportsXA<span class="jive-xml-tag">&lt;/config-property-name&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;config-property-type&gt;</span>java.lang.Boolean<span class="jive-xml-tag">&lt;/config-property-type&gt;</span>
<span class="jive-xml-tag">&lt;/config-property&gt;</span> 
</code></pre><p>Please note, that some other properties which cause warnings could be fixed too, but in my case I needed only SupportsXA from the list of "wrong configured by default" properties.</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><h3>Configure Tibco JMS client libraries in JBoss7</h3><ul><li>Create the following folders structure <strong>[Jboss7]\modules\com\tibco\tibjms\main</strong></li><li>Copy <strong>tibjms.jar</strong> and <strong>tibcrypt.jar</strong> to <strong>[Jboss7]\modules\com\tibco\tibjms\main</strong></li><li>Create <strong>module.xml </strong>with the following content:</li></ul><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;module xmlns="urn:jboss:module:1.1" name="com.tibco.tibjms"&gt;</span>

&#160;&#160;&#160; <span class="jive-xml-tag">&lt;resources&gt;</span>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;resource-root path="tibjms.jar"/&gt;</span>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;resource-root path="tibcrypt.jar"/&gt;</span>
&#160;&#160;&#160; <span class="jive-xml-tag">&lt;/resources&gt;</span>

&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;dependencies&gt;</span>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;module name="javax.api"/&gt;</span>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;module name="javax.jms.api"/&gt;</span>
&#160;&#160;&#160; <span class="jive-xml-tag">&lt;/dependencies&gt;</span>
<span class="jive-xml-tag">&lt;/module&gt;</span>
</code></pre><ul><li>Open<strong> [Jboss7]\modules\org\jboss\as\ee\main\module.xml</strong> and add dependency to com.tibco.tibjms</li></ul><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;dependencies&gt;</span>

&#160;&#160;&#160;&#160; <span class="jive-xml-comment">&lt;!-- Don't delete what was written here, just add com.tibco.tibjms at the bottom --&gt;</span>

&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;module name="com.tibco.tibjms"/&gt;</span>
<span class="jive-xml-tag">&lt;/dependencies&gt;</span>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><h3>Configure Tibco EMS</h3><p>In Tibco EMS create connection factory and queue that you would like to use. The following command in TibcoEMS Administrator tool will help you do that:</p><pre class="jive-pre"><code class="jive-code jive-java">tcp:<font color="darkgreen">//localhost:7222&gt; create factory MyConnectionFactory xaqueue url=tcp://tibcohost:7222</font>
</code></pre><p>And create queue:</p><pre class="jive-pre"><code class="jive-code jive-java">tcp:<font color="darkgreen">//localhost:7222&gt; create queue MySampleQueue</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><h3>Configure Resource Adapter in Jboss7</h3><p>Deploy genericra.rar - it should deploy fine without any exceptions. In the administrator console create new Resrouce Adapter providing archive name <strong>genericra.rar</strong>. Add following properties:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre class="jive-pre"><code class="jive-code">ProviderIntegrationMode=jndi
UserName=[Your Tibco EMS admin username]
Password=[Your Tibco EMS admin password]
JndiProperties=java.naming.factory.url.pkgs=com.tibco.tibjms.naming,java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory,java.naming.provider.url=[Tibco host URL]:7222
SupportsXA=true
LogLevel=finest
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Open standalone.xml ([Jboss7]\standalone\configuration\standalone.xml) and add the following lines in&#160; &lt;subsystem xmlns="urn:jboss:domain:ejb3:1.2"&gt;</p><pre class="jive-pre"><code class="jive-code jive-xml"><span class="jive-xml-tag">&lt;mdb&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;resource-adapter-ref resource-adapter-name="genericra.rar"/&gt;</span>
&#160;&#160;&#160;&#160; <span class="jive-xml-tag">&lt;bean-instance-pool-ref pool-name="mdb-strict-max-pool"/&gt;</span>
<span class="jive-xml-tag">&lt;/mdb&gt;</span>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><h3>Create Sample MDB</h3><p>When creating MessageDriven beans you need to use org.jboss.ejb3.annotation.ResourceAdapter to let container know that you want to use external messaging provider. Please find below sample message driven bean that you could use to check that integration is working:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre class="jive-pre"><code class="jive-code jive-java">@MessageDriven(activationConfig = <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @ActivationConfigProperty(propertyName = <font color="red">"destinationType"</font>, propertyValue = <font color="red">"javax.jms.Queue"</font>),
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @ActivationConfigProperty(propertyName = <font color="red">"destinationJndiName"</font>, propertyValue = <font color="red">"MySampleQueue"</font>),
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @ActivationConfigProperty(propertyName = <font color="red">"connectionFactoryJndiName"</font>, propertyValue = <font color="red">"MyConnectionFactory"</font>),
<font color="navy">}</font>)
@ResourceAdapter(<font color="red">"genericra.rar"</font>)
<font color="navy"><b>public</b></font> <font color="navy"><b>class</b></font> SampleMdb <font color="navy"><b>implements</b></font> MessageListener <font color="navy">{</font>
&#160;
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; @Override
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> onMessage(Message message) <font color="navy">{</font>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(<font color="red">"TibcoEMS integration is working!"</font>);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <font color="navy">}</font>
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>To test that MDB is listening to TibcoEMS queue use this code:</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><pre class="jive-pre"><code class="jive-code jive-java">@Test
<font color="navy"><b>public</b></font> <font color="navy"><b>void</b></font> testOnMessage() <font color="navy"><b>throws</b></font> Exception <font color="navy">{</font>
&#160;&#160;&#160;&#160; Properties properties = <font color="navy"><b>new</b></font> Properties();
&#160;&#160;&#160;&#160; properties.put(<font color="red">"java.naming.factory.url.pkgs"</font>, <font color="red">"com.tibco.tibjms.naming"</font>);
&#160;&#160;&#160;&#160; properties.put(<font color="red">"java.naming.factory.initial"</font>, <font color="red">"com.tibco.tibjms.naming.TibjmsInitialContextFactory"</font>);
&#160;&#160;&#160;&#160; properties.put(<font color="red">"java.naming.provider.url"</font>, <font color="red">"tibcohost:7222"</font>);
&#160;
&#160;&#160;&#160;&#160; InitialContext context = <font color="navy"><b>new</b></font> InitialContext(properties);
&#160;&#160;&#160;&#160; ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(<font color="red">"MyConnectionFactory"</font>);
&#160;&#160;&#160;&#160; Connection connection = connectionFactory.createConnection();
&#160;&#160;&#160;&#160; Destination destination = (Destination) context.lookup(<font color="red">"MySampleQueue"</font>);
&#160;&#160;&#160;&#160; Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
&#160;&#160;&#160;&#160; MessageProducer producer = session.createProducer(destination);
&#160;&#160;&#160;&#160; TextMessage message = session.createTextMessage();
&#160;&#160;&#160;&#160; producer.send(message);
<font color="navy">}</font>
</code></pre><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p style="min-height: 8pt; height: 8pt; padding: 0px;">&#160;</p><p>Hope this article is helpful.</p><p>Thanks,</p><p>Yevgen Kravchenko</p></div>

<div style="background-color: #f4f4f4; padding: 10px; margin-top: 20px;">
    <p style="margin: 0;">Comment by <a href="https://community.jboss.org/docs/DOC-47346">going to Community</a></p>

        <p style="margin: 0;">Create a new document in JBoss Messaging at <a href="https://community.jboss.org/choose-container!input.jspa?contentType=102&containerType=14&container=2042">Community</a></p>
</div></td>
                        </tr>
                    </tbody>
                </table>


                </td>
            </tr>
        </tbody>
    </table>

</div>

</body>
</html>