Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This section explains, through an example scenario, how the Message Broker EIP can be implemented using WSO2 ESB. The following topics are covered:

Table of Contents
maxLevel5

...

Setting up WSO2 Message Broker
  1. Download a binary version of WSO2 Start Message Broker from http://wso2.com/products/message-broker, and extract the distribution, which will be referred to as <MB_HOME>.
  2. Open <MB_HOME>/repository/conf/carbon.xml file, and change the offset of ports to 1. This is done to ensure that there will be no port conflicts when you run multiple WSO2 products simultaneously on the same server.

    Code Block
    <Ports>
    <Offset>1</Offset>
    ...
  3. Change the default virtual host to carbon in <MB_HOME>/repository/conf/advanced/qpid-virtualhosts.xml file.

    Code Block
    <virtualhosts>
        <default>carbon</default>
    ...
  4. Start WSO2 MB server by executing wso2server.sh (or wso2server.bat in Windows) file in the <MB_HOME>/bin directory.profile by executing the following script: <EI_HOME>/wso2/broker/bin/wso2server.sh
Setting up WSO2 ESB
  1. Download and install WSO2 ESB from  http://wso2.com/products/enterprise-service-bus . Installation home will be referred to as <ESB_HOME>. For a list of prerequisites and step-by-step installation instructions, refer to Getting Started Installation Guide in the WSO2 ESB documentation.
  2. Copy the following files from <MB <EI_HOME>/wso2/broker/client-lib to <ESB<EI_HOME>HOME>/repository/components/lib.
    • geronimo-jms_1.1_spec-1.1.0.wso2v1.jar
    • andes-client-0.13.wso2v8.1.jar
  3. Enable the JMS transport receivers and senders by uncommenting the relevant sections in the <ESB<ESB_HOME>HOME>/repository/conf/axis2/axis2.xml file. For example:

    Code Block
    languagehtml/xml
    <transportReceiver name="jms" class="org.apache.axis2.transport.jms.JMSListener">
            <parameter name="myTopicConnectionFactory" locked="false">
               <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
                <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
                <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
                <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
            </parameter>
            <parameter name="myQueueConnectionFactory" locked="false">
                <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
                <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
                <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
               <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
            </parameter>
            <parameter name="default" locked="false">
                <parameter name="java.naming.factory.initial" locked="false">org.wso2.andes.jndi.PropertiesFileInitialContextFactory</parameter>
                <parameter name="java.naming.provider.url" locked="false">repository/conf/jndi.properties</parameter>
                <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
                <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
            </parameter>
    </transportReceiver>
    .........
    
    
    <transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>
  4. Define the following properties in the <ESB_HOME>/repository/conf/jndi.properties file.

    Code Block
    languagehtml/xml
    .....
    #Need change QueueConnection factory as follows
    connectionfactory.QueueConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5673'
    connectionfactory.TopicConnectionFactory = amqp://admin:admin@clientID/carbon?brokerlist='tcp://localhost:5673'
    
    # register some queues in JNDI using the form
    # queue.[jndiName] = [physicalName]
    queue.myqueue=myqueue
    
    # register some topics in JNDI using the form - Commented since this sample is not going to use Topics
    # topic.[jndiName] = [physicalName]
    #topic.MyTopic = example.MyTopic
    Start the sample Axis2 server on ports 9001 and 9002. For instructions, refer to the section ESB Samples Setup - Starting Sample Back-End Services in the WSO2 ESB documentation.


    Port should be 5675 for EI with MB profile. Default port is 5672 and MB profile runs with a port offset of 3.
    You do not need Axis2 server for this example scenario. You do not view a response in StockQuote client.
    ESB Console output: 

    INFO - LogMediator To: , WSAction: "urn:getQuote", SOAPAction: "urn:getQuote", MessageID: ID:8f192fb7-c90b-369e-b2af-4db9d38bc041, Direction: request, Subscriber = I am Subscribed to messages coming to StockQuoteProxy., Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Envelope><soapenv:Body><m0:getQuote xmlns:m0="http://services.samples"><m0:request><m0:symbol>WSO2</m0:symbol></m0:request></m0:getQuote></soapenv:Body></soapenv:Envelope></soapenv:Body></soapenv:Envelope>

ESB configuration

Start the ESB server and log into its management console UI (https: //localhost:9443/carbon ). In the management console,  navigate to the Main menu and click Source View in the Service Bus section . Next, copy and paste the following configuration, which helps you explore the example scenario, to the source view.  

Anchor
step10
step10

Code Block
languagehtml/xml
linenumberstrue
<?xml<definitions versionxmlns="1.0" encoding="UTF-8"?>
<definitionshttp://ws.apache.org/ns/synapse">
<proxy xmlns="http://ws.apache.org/ns/synapse"> name="StockQuoteProxy" transports="http https" <proxy namestartOnLoad="StockQuoteProxy"true">
    <description/>
    <target>
        <inSequence>
            <property  transportsname="OUT_ONLY" value="http"true"/>
            <property  startOnLoadname="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
            <property name="transport.jms.ContentTypeProperty"  tracevalue="Content-Type" scope="disableaxis2"/>
            <send>
<description/>       <target> 			<!-- Send message to WSO2 MB -->  <endpoint>
       <endpoint>             <address uri="jms:/myqueue?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory&amp;java.naming.provider.url=repository/conf/jndi.properties&amp;transport.jms.DestinationType=queue"/>
                </endpoint>
            </send>
  <inSequence>      </inSequence>
      <property name="OUT_ONLY" value="true"/> <outSequence>
            <property name="FORCETRANSPORT_SC_ACCEPTEDHEADERS" valuescope="trueaxis2" scopeaction="axis2remove"/>
            <send/>
     <property name="transport.jms.ContentTypeProperty"  </outSequence>
    </target>
</proxy>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="StockQuoteProxyConsumer" transports="jms" startOnLoad="true">
    <description/>
    value="Content-Type"<target>
        <inSequence>
             scope<property name="OUT_ONLY" value="axis2true"/>
         </inSequence>      <log level="full">
   <outSequence>             <property name="TRANSPORT_HEADERSSubscriber" scopevalue="axis2" action="removeI am Subscribed to messages coming to StockQuoteProxy."/>
            <send/></log>
            <<drop/outSequence>>
        </target>inSequence>
   </proxy>    <sequence name="fault">
 <outSequence>
     <log level="full">      <send/>
   <property name="MESSAGE" value="Executing default &#34;fault&#34; sequence"/> </outSequence>
    </target>
    <property<parameter name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
 transport.jms.DestinationType">queue</parameter>
    <parameter name="transport.jms.Destination">myqueue</parameter>
    <parameter name="transport.jms.ContentType">
       <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/> <rules xmlns="">
         </log>   <jmsProperty>contentType</jmsProperty>
      <drop/>    </sequence>   <default>application/xml</default>
<sequence name="main">       <log</>rules>
    </parameter>
 <drop/>   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
</sequence>proxy>
</definitions>



Simulating the sample scenario

Send a request using Stock Quote client to the proxy service in the following manner. For information on the Stock Quote client, refer to the Sample Clients section in WSO2 ESB documentation. 

ant stockquote -Dtrpurl=http://localhost:8280/services/StockQuoteProxy -Dsymbol=WSO2

You will not view a response in 

Note that the request is stored in WSO2 Message Broker. Any consumer can access the stored message by accessing  destinationMyQueue in WSO2 Message Broker.

How the implementation works

...

  • jms:/myqueue - Looks for a JNDI entry myqueue (see JNDI properties above).
  • ? - Separator indicating extra attributes.
  • transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory - Looks up ConnectionFactory in JNDI with name QueueConnectionFactory.
  • &amp;  - Separator (this will convert to ‘&’)
  • java.naming.factory.initial=org.wso2.andes.jndi.PropertiesFileInitialContextFactory -  Uses the andes properties-based JNDI.
  • &amp;  - Another separator (this will convert to ‘&’)
  • java.naming.provider.url=repository/conf/jndi.properties -  Looks in  repository/conf/jndi.properties for the JNDI properties file.