WSO2 ESB will be support two way TCP Transport in upcoming releases(currently it will be not available but generic support for there with the WSO2 ESB TCP Transport) which client can send and receive messages to the TCP Proxy through same TCP Connection. In TCP transport, there will be need of determining the end of message which needs to be mediated through the ESB. So with the implementation ESB will support splitting message with character, sequence of characters, message length and special characters in hex form. There is a option that client can select which input type where client send the request to tcp proxy. For now the options available for the input type is binary and string. Splitting the message by single character will be the most efficient.
Available properties.
- "transport.tcp.port" - TCP Port
- "transport.tcp.contentType" - Input message content type
- "transport.tcp.recordDelimiter" - record delimiter
- "transport.tcp.recordDelimiterType" -type of delimiter (string, character, byte)
- "transport.tcp.recordLength" - Length of message to splitted. If this is set then delimiter properties will be omitted
- "transport.tcp.responseClient - Set if client need to get the response;
- "transport.tcp.inputType" - Input type of message (string, binary)
Below shows sample proxy which split the message with character. It expected receive message with empty body it will be forward to http endpoint after enrich the body with the IBM symbol.
Requesting message
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">""<soapenv:Header/><soapenv:Body/></soapenv:Envelope>"
<proxy name="TCPProxy" transports="tcp" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <property name="symbol" value="IBM" scope="default" type="STRING"/> <enrich> <source type="inline" clone="true"> <m:getQuote xmlns:m="http://services.samples"> <m:request> <m:symbol>?</m:symbol> </m:request> </m:getQuote> </source> <target type="body"/> </enrich> <enrich> <source type="property" clone="true" property="symbol"/> <target xmlns:m="http://services.samples" xpath="//m:getQuote/m:request/m:symbol"/> </enrich> <log level="full" separator=","/> <send> <endpoint> <address uri="http://localhost:9000/services/SimpleStockQuoteService" format="soap11"/> </endpoint> </send> </inSequence> <outSequence> <log level="full"/> <send/> </outSequence> </target> <parameter name="transport.tcp.responseClient">true</parameter> <parameter name="transport.tcp.recordDelimiter">|</parameter> <parameter name="transport.tcp.inputType">string</parameter> <parameter name="transport.tcp.port">6789</parameter> <parameter name="transport.tcp.recordDelimiterType">character</parameter> <parameter name="transport.tcp.contentType">text/xml</parameter> </proxy>Below shows splitting an input message with special charactor apend to end of the message.
<proxy name="TCPProxy" transports="tcp" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <property name="symbol" value="IBM" scope="default" type="STRING"/> <enrich> <source type="inline" clone="true"> <m:getQuote xmlns:m="http://services.samples"> <m:request> <m:symbol>?</m:symbol> </m:request> </m:getQuote> </source> <target type="body"/> </enrich> <enrich> <source type="property" clone="true" property="symbol"/> <target xmlns:m="http://services.samples" xpath="//m:getQuote/m:request/m:symbol"/> </enrich> <log level="full" separator=","/> <send> <endpoint> <address uri="http://localhost:9000/services/SimpleStockQuoteService" format="soap11"/> </endpoint> </send> </inSequence> <outSequence> <log level="full"/> <send/> </outSequence> </target> <parameter name="transport.tcp.recordDelimiter">0x03</parameter> <parameter name="transport.tcp.responseClient">true</parameter> <parameter name="transport.tcp.inputType">binary</parameter> <parameter name="transport.tcp.port">6789</parameter> <parameter name="transport.tcp.recordDelimiterType">byte</parameter> <parameter name="transport.tcp.contentType">text/xml</parameter> </proxy>Below proxy shows splitting with the sequence of characters.
<proxy name="TCPProxy" transports="tcp" startOnLoad="true" trace="disable"> <description/> <target> <inSequence> <property name="symbol" value="IBM" scope="default" type="STRING"/> <enrich> <source type="inline" clone="true"> <m:getQuote xmlns:m="http://services.samples"> <m:request> <m:symbol>?</m:symbol> </m:request> </m:getQuote> </source> <target type="body"/> </enrich> <enrich> <source type="property" clone="true" property="symbol"/> <target xmlns:m="http://services.samples" xpath="//m:getQuote/m:request/m:symbol"/> </enrich> <log level="full" separator=","/> <send> <endpoint> <address uri="http://localhost:9000/services/SimpleStockQuoteService" format="soap11"/> </endpoint> </send> </inSequence> <outSequence> <log level="full"/> <send/> </outSequence> </target> <parameter name="transport.tcp.responseClient">true</parameter> <parameter name="transport.tcp.recordDelimiter">split</parameter> <parameter name="transport.tcp.inputType">string</parameter> <parameter name="transport.tcp.port">6789</parameter> <parameter name="transport.tcp.recordDelimiterType">string</parameter> <parameter name="transport.tcp.contentType">text/xml</parameter> </proxy>
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class TCPClient { String host = "localhost"; int port = 6789; Socket socket = null; int count = 0; public static void main(String args[]) throws Exception { Character aByte = 0x10; TCPClient client = new TCPClient(); String message = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<soapenv:Header/><soapenv:Body/></soapenv:Envelope>" + aByte; client.sendToServer(message); client.recieveFromServer(); client.sendToServer(message); client.recieveFromServer(); client.close(); } TCPClient() throws Exception { socket = new Socket(host, port); } void sendToServer(String msg) throws Exception { //create output stream attached to socket PrintWriter outToServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); //send msg to server outToServer.print(msg); outToServer.flush(); } void recieveFromServer() throws Exception { char delimiter = 0x10; InputStream inFromServer = socket.getInputStream(); //read from server int next = inFromServer.read(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); while (next > -1) { if (delimiter != next) { bos.write(next); } next = inFromServer.read(); if (delimiter == next) { System.out.println(new String(bos.toByteArray())); count++; if (count == 1 || count == 2) { break; } bos = new ByteArrayOutputStream(); } } if (count == 2) { close(); } } void close() throws IOException { socket.close(); } }