1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.tcp;
12
13 import org.mule.DefaultMuleMessage;
14 import org.mule.api.construct.FlowConstruct;
15 import org.mule.api.endpoint.InboundEndpoint;
16 import org.mule.api.lifecycle.CreateException;
17 import org.mule.api.transport.Connector;
18 import org.mule.transport.AbstractPollingMessageReceiver;
19 import org.mule.transport.tcp.i18n.TcpMessages;
20 import org.mule.util.MapUtils;
21
22 import java.net.Socket;
23 import java.net.SocketTimeoutException;
24
25
26
27
28
29
30
31 public class PollingTcpMessageReceiver extends AbstractPollingMessageReceiver
32 {
33 private int timeout;
34
35 private PollingTcpConnector connector;
36
37 public PollingTcpMessageReceiver(Connector connector, FlowConstruct flowConstruct, InboundEndpoint endpoint)
38 throws CreateException
39 {
40 super(connector, flowConstruct, endpoint);
41
42 if (connector instanceof PollingTcpConnector)
43 {
44 this.connector = (PollingTcpConnector) connector;
45 }
46 else
47 {
48 throw new CreateException(TcpMessages.pollingReceiverCannotbeUsed(), this);
49 }
50
51 timeout = MapUtils.getIntValue(endpoint.getProperties(), "clientSoTimeout",
52 this.connector.getClientSoTimeout());
53
54 if (timeout > Integer.MAX_VALUE || timeout < 0)
55 {
56 throw new IllegalArgumentException("Timeout incorrect: " + timeout);
57 }
58
59 long pollingFrequency = MapUtils.getLongValue(endpoint.getProperties(), "pollingFrequency",
60 this.connector.getPollingFrequency());
61 if (pollingFrequency > 0)
62 {
63 this.setFrequency(pollingFrequency);
64 }
65 }
66
67 @Override
68 public void poll() throws Exception
69 {
70 Socket socket = connector.getSocket(endpoint);
71 try
72 {
73 Object result = TcpMessageDispatcher.receiveFromSocket(socket, timeout, endpoint);
74 if (!(result == null))
75 {
76 this.routeMessage(new DefaultMuleMessage(result, connector.getMuleContext()));
77 if (logger.isDebugEnabled())
78 {
79 logger.debug("Routing new message: " + result);
80 }
81 }
82 }
83 catch (SocketTimeoutException e)
84 {
85 if (logger.isDebugEnabled())
86 {
87 logger.debug("Socket timed out normally while doing a synchronous receive on endpointUri: "
88 + endpoint.getEndpointURI());
89 }
90 }
91 finally
92 {
93 connector.releaseSocket(socket, endpoint);
94 }
95 }
96 }