Tuesday, May 23, 2017

WSO2 ESB message flow

This post explains the message flow of the synapse which is the main building block of WSO2 ESB.

Synapse receives the message from the axis2 transport layer. Inside this transport layer, message will be built based on the content type of the message and then passed over to the Synapse. 

Following is the Inflow of the message from the entry point to synapse,

//Entry point
org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive()
//Create synapse message context out of axis2 message context
org.apache.synapse.core.axis2.MessageContextCreatorForAxis2.getSynapseMessageContext()
//If there is insequence, sequence mediator is invoked
org.apache.synapse.mediators.base.SequenceMediator.mediate()
//Then registered mediators are executed in order via AbstractListMediator
org.apache.synapse.mediators.AbstractListMediator.mediate()
//When there is an invoke to a backend service
org.apache.synapse.endpoints.AbstractEndpoint.send()
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send()
org.apache.synapse.core.axis2.Axis2Sender.sendOn()
org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send()


Inside the Axis2FlexibleMEPClient.send() method, a callback is registered in axis2 transport layer and message is dispatched out of the synapse. Then the axis2 transport layer format this message based on the content type and send it to the backend.

When the response is coming from a backend service, transport layer identifies this and synapse response path is invoked.

Following is the synapse response path,

//Entry point for response path
org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive()
org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage()
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage()
//invoke the outsequence
org.apache.synapse.mediators.base.SequenceMediator.mediate()
//invoke the mediators in order
org.apache.synapse.mediators.AbstractListMediator.mediate()
//send mediator
org.apache.synapse.mediators.builtin.SendMediator.mediate()
org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send()
//send back the response
org.apache.synapse.core.axis2.Axis2Sender.sendBack()


This completes the message flow for the following proxy service configuration.

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="TestProxy"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="http,https">
<target>
<inSequence>
<send>
<endpoint>
<address uri="http://www.mocky.io/v2/5923c7571000006a1700352a"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<send/>
</outSequence>
</target>
<description/>
</proxy>
view raw SampleProxy.xml hosted with ❤ by GitHub


Monday, May 22, 2017

Processing Binary Data from TCP transport in WSO2 ESB

This post describes how to process binary data over TCP transport in WSO2 ESB.


  • First we need to enable binary transport. Add following entries in ESB_HOME/repository/conf/axis2/axis2.xml. 
    <transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportListener" />
    <transportSender name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportSender"/>
    view raw axis2.xml hosted with ❤ by GitHub

  • Now you need to add the message formatters and message builders to be used. Since we are using binary data, add following entry inside messageFormatters element. 
    <messageFormatter contentType="application/binary" class="org.wso2.carbon.relay.ExpandingMessageFormatter"/>
    view raw axis2.xml hosted with ❤ by GitHub
          Add following entry inside messageBuilders element. 
<messageBuilder contentType="application/binary" class="org.wso2.carbon.relay.BinaryRelayBuilder"/>
view raw axis2.xml hosted with ❤ by GitHub

  • Now you can add a tcp proxy service to process the message. In that proxy service you need to add the same content type used in messageFormatter and messageBuilder configs. There are several other parameters specific to TCP proxies. Refer [1] for more info on that. Following is a sample proxy service that prints the binary message. 
    <?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
    name="TCPProxy"
    startOnLoad="true"
    statistics="disable"
    trace="disable"
    transports="tcp">
    <target>
    <inSequence>
    <log level="full"/>
    </inSequence>
    <faultSequence>
    <log level="full"/>
    </faultSequence>
    </target>
    <parameter name="transport.tcp.recordDelimiter">|</parameter>
    <parameter name="transport.tcp.inputType">binary</parameter>
    <parameter name="transport.tcp.port">6060</parameter>
    <parameter name="transport.tcp.recordDelimiterType">character</parameter>
    <parameter name="transport.tcp.contentType">application/binary</parameter>
    <description/>
    </proxy>
    view raw TcpProxy.xml hosted with ❤ by GitHub

  • Now you can invoke this proxy service using a sample TCP client. End of message should be marked with a "|" symbol in this particular proxy service.