The WSO2 JMS transport can be configured with IBM® WebSphere® MQ. The following topics cover the configuration steps.
Table of Contents | ||||
---|---|---|---|---|
|
...
- WSO2 ESB is installed. To test the samples, you must also have Apache Ant installed. For details, see Installation Prerequisites.
- WebSphere MQ is installed and the latest fix pack applied (see the IBM documentation). The fix pack can be obtained from http://www-01.ibm.com/software/integration/wmq. (These instructions are tested on IBM WebSphere MQ version 8.0.0.4.)
Creating queue manager, queue and channel in IBM WebSphere MQ
- Start IBM WebSphere MQ Explorer as an administrator. If you are not running on an administrator account, right-click on the IBM WebSphere MQ icon/menu item and then click Run as Administrator.
- Right-click on Queue Managers, move the cursor to New and then click Queue Manager to open the Create Queue Manager wizard. Enter
ESBQManager
as the queue manager name. Make sure you select the make this the default queue manager check box. Leave the default values unchanged in the other fields. Click Next to move to the next page. - Click Next on the page for entering data and log values without changing any default values.
- On the page for entering configuration options, specify the configuration options as done in the following diagram, and click Next.
Configure the following in the page for entering listener options.
Field Name Value Create listener configured for TCP/IP check box Select this check box to create the listener. Listen on port number field Enter the number of the port where you want to set the listener. In this example, the port number will be 1414. - Click Next and then click Finish to save the configuration. The queue manager will be created as shown below.
- Expand the navigation tree of the
ESBQManager
queue manager in the navigation tree. Right-click on Queues, move the cursor to New and then click Local Queue to open the Create a Local Queue wizard. Enter the local queue name asLocalQueue1
and complete running the wizard. Leave the default values of all other fields unchanged, and click Finish to save the local queue.Anchor Qmanager Qmanager - Right-click on Channels, move the cursor to New , and then click Server-connection Channel to open the Create a Server-connection Channel wizard. Enter myChannel as the channel name and click Next. Make sure that the value for the Transmission Protocol is TCP. Leave the default values unchanged for the rest of the fields, and click Finish to save the channel.
...
Code Block |
---|
runmqsc ESBQManager |
Code Block |
---|
ALTER QMGR CHLAUTH(DISABLED) |
The following will be displayed in the command prompt.
Configuring WSO2 ESB JMS transport
Add the following transport receiver to the <ESB_HOME>/repository/conf/axis2/axis2.xml
file.
...
Info |
---|
|
Add the following transport receiver to the
<ESB_HOME>/repository/conf/axis2/axis2.xml
file.Code Block language xml <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener"> <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:/G:/jndidirectory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.UserName" locked="false">nandika</parameter> <parameter name="transport.jms.Password" locked="false">password</parameter> </parameter> <parameter name="myQueueConnectionFactory1" 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:/G:/jndidirectory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.UserName" locked="false">nandika</parameter> <parameter name="transport.jms.Password" locked="false">password</parameter> </parameter> </transportReceiver>
Add the following transport sender to the
<ESB_HOME>/repository/conf/axis2/axis2.xml
file.Code Block language xml <transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"> <parameter name="default" locked="false"> <parameter name="vender.class.loader.enabled">false</parameter> <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter> <parameter name="java.naming.provider.url" locked="false">file:/G:/jndidirectory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter> <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> <parameter name="transport.jms.UserName" locked="false">nandika</parameter> <parameter name="transport.jms.Password" locked="false">password</parameter> </parameter> <parameter name="myQueueConnectionFactory1" 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:/G:/jndidirectory</parameter> <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory<.fscontext.RefFSContextFactory</parameter> <parameter name="transportjava.naming.jmsprovider.ConnectionFactoryTypeurl" locked="false">queue<>file:/G:/jndidirectory</parameter> <parameter name="transport.jms.UserNameConnectionFactoryJNDIName" locked="false">nandika<>MyQueueConnectionFactory</parameter> <parameter name="transport.jms.PasswordConnectionFactoryType" locked="false">password<>queue</parameter> </parameter> </transportSender>
Info The
vender.class.loader.enabled
parameter in the above configuration should be added only when you use IBM Websphere MQ as the JMS broker.WSO2 uses some external class loader mechanisms for some external products such as QPID and AMQP due to the limitation of serializing the JMSObject message. However, it is not required to use this mechanism for IBM Websphere MQ. By adding the
vender.class.loader.enabled
parameter, you can skip the external class loader for IBM Websphere MQ.This property can also be included in a proxy service, REST API, message store, JMS receiver or the Synapse configuration depending on the use case.
<parameter name="transport.jms.UserName" locked="false">nandika</parameter> <parameter name="transport.jms.Password" locked="false">password</parameter> </parameter> </transportSender>
Copying IBM Websphere MQ libraries
...
Code Block | ||
---|---|---|
| ||
<proxy xmlns="http://ws.apache.org/ns/synapse" name="MyJMSProxy" transports="jms" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <log level="full"/> <drop/> </inSequence> </target> <parameter name="transport.jms.Destination">LocalQueue1</parameter> </proxy> |
...
Testing the proxy service
...
The message will be logged in the ESB Management console as well as the log file.
Sample Scenarios
This section describes how to configure the following sample scenarios using the JMS transport, WebSphere MQ, and WSO2 ESB:
...
In
<ESB_HOME>\repository\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 ESB with the Sample 251 configuration using the following command.
wso2esb-samples.bat -sn 251
- Log into the ESB server management console at: https://localhost:9443/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:repository/samples/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<ESB_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<ESB_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 ESB Anchor TopicScenario1 TopicScenario1
TopicScenario1 | |
TopicScenario1 |
In this scenario, the JMS client places an order on the topic ivtT. The ESB listens to this topic, gets the message, and sends it to the back-end server to process the request.
In
<ESB_HOME>\repository\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 the ESB with the Sample 250 configuration by running the following command.
wso2esb-samples.bat -sn 250
Log in to the server management console at: https://localhost:9443/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
<ESB_HOME>/samples/axis2Client
directory and build it using theant
command.Go to the
<ESB_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:repository/samples/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
<ESB_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.
...