Add socket and server socket timeout support to thrift java
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664804 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/transport/TServerSocket.java b/lib/java/src/transport/TServerSocket.java
index 8a8421d..ab2b5e7 100644
--- a/lib/java/src/transport/TServerSocket.java
+++ b/lib/java/src/transport/TServerSocket.java
@@ -4,6 +4,7 @@
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
+import java.net.SocketException;
/**
* Wrapper around ServerSocket for Thrift.
@@ -12,19 +13,55 @@
*/
public class TServerSocket extends TServerTransport {
+ /**
+ * Underlying serversocket object
+ */
private ServerSocket serverSocket_ = null;
+
+ /**
+ * Port to listen on
+ */
private int port_ = 0;
+ /**
+ * Timeout for client sockets from accept
+ */
+ private int clientTimeout_ = 0;
+
+ /**
+ * Creates a server socket from underlying socket object
+ */
public TServerSocket(ServerSocket serverSocket) {
- serverSocket_ = serverSocket;
+ this(serverSocket, 0);
}
+ /**
+ * Creates a server socket from underlying socket object
+ */
+ public TServerSocket(ServerSocket serverSocket, int clientTimeout) {
+ serverSocket_ = serverSocket;
+ clientTimeout_ = clientTimeout;
+ }
+
+ /**
+ * Creates just a port listening server socket
+ */
public TServerSocket(int port) throws TTransportException {
+ this(port, 0);
+ }
+
+ /**
+ * Creates just a port listening server socket
+ */
+ public TServerSocket(int port, int clientTimeout) throws TTransportException {
port_ = port;
+ clientTimeout_ = clientTimeout;
try {
+ // Make server socket
serverSocket_ = new ServerSocket();
+ // Prevent 2MSL delay problem on server restarts
serverSocket_.setReuseAddress(true);
- serverSocket_.setSoTimeout(0);
+ // Bind to listening port
serverSocket_.bind(new InetSocketAddress(port_));
} catch (IOException ioe) {
serverSocket_ = null;
@@ -32,7 +69,16 @@
}
}
- public void listen() throws TTransportException {}
+ public void listen() throws TTransportException {
+ // Make sure not to block on accept
+ if (serverSocket_ != null) {
+ try {
+ serverSocket_.setSoTimeout(0);
+ } catch (SocketException sx) {
+ sx.printStackTrace();
+ }
+ }
+ }
protected TSocket acceptImpl() throws TTransportException {
if (serverSocket_ == null) {
@@ -40,7 +86,9 @@
}
try {
Socket result = serverSocket_.accept();
- return new TSocket(result);
+ TSocket result2 = new TSocket(result);
+ result2.setTimeout(clientTimeout_);
+ return result2;
} catch (IOException iox) {
throw new TTransportException(iox);
}