Reading Time: 2 minutes

Right now TCP inbound endpoints are implemented as TCP servers that listen for coming from different clients. In ESB 2.2.6 we are adding a new feature to inverse the control: TCP inbounds can now poll data from remote servers.

It is really easy to switch to this strategy. Let’s take a look of how a mule configuration looks like:

<!--?xml version="1.0" encoding="UTF-8"?-->
<mule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tcp="http://www.mulesource.org/schema/mule/tcp/2.2" xmlns:vm="http://www.mulesource.org/schema/mule/vm/2.2" xsi:schemalocation="
           http://www.mulesource.org/schema/mule/core/2.2
           http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
           http://www.mulesource.org/schema/mule/vm/2.2 
           http://www.mulesource.org/schema/mule/vm/2.2/mule-vm.xsd
           http://www.mulesource.org/schema/mule/tcp/2.2 
           http://www.mulesource.org/schema/mule/tcp/2.2/mule-tcp.xsd">

    <vm:connector name="queue" queueevents="true">

    <tcp:polling-connector name="pollingConnector" clientsotimeout="3000" pollingfrequency="1000">
        <tcp:direct-protocol payloadonly="true">
    </tcp:direct-protocol></tcp:polling-connector>

    <model name="echoModel">
        <service name="echo">
            <inbound>
                <tcp:inbound-endpoint host="localhost" port="4444">
            </tcp:inbound-endpoint></inbound>
            <outbound>
                <pass-through-router>
                    <vm:outbound-endpoint path="out" connector-ref="queue">
                </vm:outbound-endpoint></pass-through-router>
            </outbound>
        </service>
    </model>
</vm:connector></mule>
latest report
Learn why we are the Leaders in management and iPaaS

Notice the new tcp:polling-connector element in the mule configuration file. This element tells mule to poll with a frequency of 1000ms and a timeout of 3000ms.
Using the above configuration we can create a TCP server that writes messages like this:

String stringMessage = "the message";
ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
out.print(stringMessage);
out.close();
clientSocket.close();

You can check the value received in the out outbound using the MuleClient like this:

MuleClient client = new MuleClient();
MuleMessage message = client.request("vm://out?connector=queue", 10000);
String receivedMessage = message.getPayloadAsString();

The receivedMessage variable will hold the received value from the TCP Server.

If you want to try it, please download Mule ESB 2.2.6 or the latest 3.0 milestone