The WSO2 JMS transport can be configured with IBM® WebSphere® MQ. The following topics cover the configuration steps.
...
- Create a directory in which the
.bindings
file can be saved in any location of your computer. In this example, a directory namedjndidirectory
will be created in theG
folder. - Go to IBM Websphere MQ, and right-click on JMS Administered Objects, and then click Add Initial Context.
- Select the File system option in the Connection Details wizard. Enter
file:G/jndidirectory
in the Context nickname field. Leave the default values unchanged for other fields and complete running the wizard. The new file initial context will be displayed in the left navigator under JMS Administered Objects as shown below.
- Click the file initial context (named
file:G/jndidirectory
in this example) in the navigator to expand it. Right-click on Connection Factories, move the cursor to New, and then click Connection Factory. Enter the name of the connection factory asMyQueueConnectionFactory
. SelectQueue Connection Factory
as the connection factory type. SelectMQClient
as the transport. Leave the default values unchanged for other fields and complete running the wizard. - Right-click on the newly connected connection factory in the left navigator, and the click Properties. Click Connection. Then browse and select
ESBQManager
for the Base queue manager field. You can change the host and port name for the connection factory if required. No changes will be made in this example since default values are used. Leave the default values unchanged for other fields and click OK. - Right-click Destination under JMS Administered Objects in the left navigator. Move the cursor to New and then click Destination to open the New Destination wizard. In order to map the destination to the local queue you created in step 7 of the Creating queue manager, queue and channel in IBM WebSphere MQ section, enter the same queue name (
LocalQueue1
in this example) in the Name field. SelectQueue
for the Type field. SelectESBQManager
as the queue manager andLocalQueue1
as the queue in the wizard. Leave the default values unchanged for other fields and complete running the wizard.
...
Create a new directory named
wmq-client
, and then create another new directory namedlib
inside it.Copy the following JAR files from the
<IBM_MQ_HOME>/java/lib/
directory (where<IBM_MQ_HOME>
refers to the IBM WebSphere MQ installation directory) to thewmq-client/lib/
directory.Note Note: If you are using IBM MQ 8 with Mutual SSL enabled, you need to download the wmq-client-8.0.0.zip file and follow the instructions in the readme.txt file.
com.ibm.mq.allclient.jar
fscontext.jar
jms.jar
providerutil.jar
Create a
POM.xml
file inside the wmq-client/
directory and add all the required dependencies as shown in the example below.Tip You need to change the values of the
<version>
and<systemPath>
properties accordingly.Code Block <?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>wmq-client</groupId> <artifactId>wmq-client</artifactId> <version>8.0.0.4</version> <packaging>bundle</packaging> <dependencies> <dependency> <groupId>com.ibm</groupId> <artifactId>fscontext</artifactId> <version>8.0.0.4</version> <scope>system</scope> <systemPath>${basedir}/lib/fscontext.jar</systemPath> </dependency> <dependency> <groupId>com.ibm</groupId> <artifactId>providerutil</artifactId> <version>8.0.0.4</version> <scope>system</scope> <systemPath>${basedir}/lib/providerutil.jar</systemPath> </dependency> <dependency> <groupId>com.ibm</groupId> <artifactId>allclient</artifactId> <version>8.0.0.4</version> <scope>system</scope> <systemPath>${basedir}/lib/com.ibm.mq.allclient.jar</systemPath> </dependency> <dependency> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> <version>1.1</version> <scope>system</scope> <systemPath>${basedir}/lib/jms.jar</systemPath> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.3.4</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Bundle-Name>${project.artifactId}</Bundle-Name> <Export-Package>*;-split-package:=merge-first</Export-Package> <Private-Package/> <Import-Package/> <Embed-Dependency>*;scope=system;inline=true</Embed-Dependency> <DynamicImport-Package>*</DynamicImport-Package> </instructions> </configuration> </plugin> </plugins> </build> </project>
Navigate to the wmq
-client
directory using your Command Line Interface (CLI), and execute the following command, to build the project: mvnclean install
Stop the WSO2 EI server, if it is already running.
Remove any existing IBM MQ client JAR files from the
<EI_HOME>/
dropins<EI_HOME>/lib
directory.Copy the
<wmq-client>/target/wmq-client-8.0.0.4.jar
file to the<EI_Home>/dropins
directory.Download the
jta.jar
file from the maven repository, and copy it to the<EI_HOME>/lib
directory.- Remove following line from the
<EI_HOME>/conf/etc/launch.
ini file:javax.jms,\
Regenerate
.bindings
file with theProvider Version : 8
property (if you already generated one before), and replace the existing.bindings
file (if you have one) with the new.bindings
file you generated.Start the WSO2 EI server.
...
This section describes how to configure the following sample scenarios using the JMS transport, WebSphere MQ, and WSO2 EI:
- Queue Scenario 1: JMS Client -> Queue -> WSO2 EI -> Axis2server
- Queue Scenario 2: JMS Client -> WSO2 EI -> Queue -> Axis2server
- Topic Scenario 1: JMS Client -> Topic -> WSO2 EI -> Axis2server
- Topic Scenario 2: JMS Client -> WSO2 EI -> Topic -> Axis2server
...
In
<EI_HOME>\conf\axis2\axis2.xml
, comment out both the myTopicConnectionFactory parameter and the SQProxyCF parameter. It should look as shown below.Code Block language html/xml <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> <!--parameter name="myTopicConnectionFactory" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <!--parameter name="SQProxyCF" locked="false"> <parameter name="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <parameter name="default" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter> </transportReceiver>
Start the WSO2 EI with the Sample 251 configuration using the following command.
wso2ei-samples.bat -sn 251
- Log into the WSO2 EI management console at: https://localhost:8243/carbon/.
- Select Service Bus -> Source view and update the JMS URL as follows.
jms:/JMS_QUEUE?transport.jms.ConnectionFactoryJNDIName=MQ_JMS_MANAGER&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:/C:/JNDI-Directory&transport.jms.DestinationType=queue&transport.jms.ConnectionFactoryType=queue &transport.jms.Destination=JMS_QUEUE
Configure the proxy service as follows.
Code Block language html/xml <definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="StockQuoteProxy" transports="https http jms" startOnLoad="true" trace="disable"> <target> <endpoint> <address uri="jms:/JMS_QUEUE?transport.jms.ConnectionFactoryJNDIName=MQ_JMS_MANAGER&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:/C:/JNDI-Directory&transport.jms.DestinationType=queue&transport.jms.ConnectionFactoryType=queue&transport.jms.Destination=JMS_QUEUE"/> </endpoint> <inSequence> <property name="TRANSPORT_HEADERS" scope="axis2" action="remove"/> <property name="OUT_ONLY" value="true"/> </inSequence> <outSequence> <send/> </outSequence> </target> <publishWSDL uri="file:samples/service-bus/resources/proxy/sample_proxy_1.wsdl"/> </proxy> <sequence name="fault"> <log level="full"> <property name="MESSAGE" value="Executing default "fault" sequence"/> <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/> <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/> </log> <drop/> </sequence> <sequence name="main"> <log/> <drop/> </sequence> </definitions>
Comment out
myTopicConnectionFactory
and uncommentSQProxyCF
in the<EI_HOME>\samples\axis2Server\repository\conf\axis2.xml
file as follows.Code Block language html/xml <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> <!--parameter name="myTopicConnectionFactory" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <parameter name="SQProxyCF" locked="false"> <parameter name="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter> <parameter name="default" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter> </transportReceiver>
Start the axis2 Server with the following command.
axis2Server.bat
Add the following parameters to
service.xml
in<EI_HOME>\samples\axis2Server\repository\services\SimpleStockQuoteService.aar.
Code Block <parameter name="transport.jms.ConnectionFactory">SQProxyCF</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter>
Send the request from the JMS client, and the sample Axis2 server console will print a message as follows.
Code Block language none ant stockquote -Daddurl=http://localhost:8280/services/StockQuoteProxy -Dmode=placeorder -Dsymbol=MSFT
Topic Scenario 1: Client to Topic to WSO2 EI Anchor TopicScenario1 TopicScenario1
TopicScenario1 | |
TopicScenario1 |
In this scenario, the JMS client places an order on the topic ivtT. The WSO2 EI listens to this topic, gets the message, and sends it to the back-end server to process the request.
In
<EI_HOME>\conf\axis2\axis2.xml
, uncomment themyTopicConnectionFactory
parameter and comment out theSQProxyCF
parameter. It should look as shown below.Code Block language xml <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> <parameter name="myTopicConnectionFactory" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter> <!--parameter name="SQProxyCF" locked="false"> <parameter name="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <parameter name="default" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter> </transportReceiver>
Start WSO2 EI with the Sample 250 configuration by running the following command.
wso2ei-samples.bat -sn 250
Log in to the server management console at: https://localhost:8243/carbon/.
Click web services -> list -> StockQuoteProxy -> edit (Specific Configuration)
Add a service parameter as follows and save it.
name = transport.jms.ConnectionFactory value = myTopicConnectionFactory
Go to the
<EI_HOME>/samples/axis2Client
directory and build it using theant
command.Go to the
<EI_HOME>/samples/axis2Client
/src/samples/userguide
directory, open theGenericJMSClient.java
source file, and make the following changes in the code.Set the jms_dest property default value to
ivtT
(line 45)Set the java.naming.provider.url to
file:/C:/JNDI-Directory
" (line 82)Set the java.naming.factory.initial to
com.sun.jndi.fscontext.RefFSContextFactory
(line 85)Set the lookup key to
MQ_JMS_MANAGER
(line 89)
Configure the proxy configuration so that it appears as follows.
Code Block language html/xml <definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="StockQuoteProxy" transports="https http jms" startOnLoad="true" trace="disable"> <target> <endpoint> <address uri="http://localhost:9000/services/SimpleStockQuoteService"/> </endpoint> <inSequence> <property name="OUT_ONLY" value="true"/> </inSequence> <outSequence> <send/> </outSequence> </target> <publishWSDL uri="file:samples/service-bus/resources/proxy/sample_proxy_1.wsdl"/> <parameter name="transport.jms.ContentType"> <rules> <jmsProperty>contentType</jmsProperty> <default>application/xml</default> </rules> </parameter> <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter> </proxy> <sequence name="fault"> <log level="full"> <property name="MESSAGE" value="Executing default "fault" sequence"/> <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/> <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/> </log> <drop/> </sequence> <sequence name="main"> <log/> <drop/> </sequence> </definitions>
Comment out the non-default connection factories in the
<EI_HOME>\samples\axis2Server\repository\conf\axis2.xml
file so that it looks as follows.Code Block language html/xml <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> <!--parameter name="myTopicConnectionFactory" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <!--parameter name="SQProxyCF" locked="false"> <parameter name="java.naming.factory.initial">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url">file:/C:/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">JMS_QUEUE</parameter> </parameter--> <parameter name="default" locked="false"> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/D/JNDI-Directory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MQ_JMS_MANAGER</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.Destination">bogusq</parameter> </parameter> </transportReceiver>
Start the axis2 server with the following command.
axis2Server.bat
Send the request from the JMS client, and the sample Axis2 server console will print a message.
...