The WSO2 JMS transport can be configured with IBM® WebSphere® MQ. The following topics cover the configuration steps.
Table of Contents | ||||
---|---|---|---|---|
|
...
Create a new directory named
wmq-client
, and then create another new directory namedlib
inside it.Add the required JAR files to the wsq
-client/lib
directory as follows:If you are using IBM MQ 8 with Mutual SSL enabled, you need to download the wmq-client-8.0.0.3.zip file and follow the instructions in the readme.txt file.
If you are not using IBM MQ 8, you can copy the following JAR files from the
<IBM_MQ_HOME>/java/lib/
directory to thewmq-client/lib/
directory. Note that<IBM_MQ_HOME>
refers to the IBM WebSphere MQ installation directory.
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.
...
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.
...