Преглед изворни кода

Implemented socket connect and read timeout.

didfet пре 10 година
родитељ
комит
af9ec174e2

+ 4 - 2
src/main/java/info/fetter/logstashforwarder/Forwarder.java

@@ -45,6 +45,7 @@ public class Forwarder {
 	private static Logger logger = Logger.getLogger(Forwarder.class);
 	private static Logger logger = Logger.getLogger(Forwarder.class);
 	private static int spoolSize = 1024;
 	private static int spoolSize = 1024;
 	private static int idleTimeout = 5000;
 	private static int idleTimeout = 5000;
+	private static int networkTimeout = 15000;
 	private static String config;
 	private static String config;
 	private static ConfigurationManager configManager;
 	private static ConfigurationManager configManager;
 	private static FileWatcher watcher;
 	private static FileWatcher watcher;
@@ -91,7 +92,7 @@ public class Forwarder {
 				Thread.sleep(idleTimeout);
 				Thread.sleep(idleTimeout);
 			} catch(AdapterException e) {
 			} catch(AdapterException e) {
 				logger.error("Lost server connection");
 				logger.error("Lost server connection");
-				Thread.sleep(configManager.getConfig().getNetwork().getTimeout() * 1000);
+				Thread.sleep(networkTimeout);
 				connectToServer();
 				connectToServer();
 			}
 			}
 		}
 		}
@@ -100,6 +101,7 @@ public class Forwarder {
 	private static void connectToServer() {
 	private static void connectToServer() {
 		int randomServerIndex = 0;
 		int randomServerIndex = 0;
 		List<String> serverList = configManager.getConfig().getNetwork().getServers();
 		List<String> serverList = configManager.getConfig().getNetwork().getServers();
+		networkTimeout = configManager.getConfig().getNetwork().getTimeout() * 1000;
 		if(adapter != null) {
 		if(adapter != null) {
 			try {
 			try {
 				adapter.close();
 				adapter.close();
@@ -114,7 +116,7 @@ public class Forwarder {
 				randomServerIndex = random.nextInt(serverList.size());
 				randomServerIndex = random.nextInt(serverList.size());
 				String[] serverAndPort = serverList.get(randomServerIndex).split(":");
 				String[] serverAndPort = serverList.get(randomServerIndex).split(":");
 				logger.info("Trying to connect to " + serverList.get(randomServerIndex));
 				logger.info("Trying to connect to " + serverList.get(randomServerIndex));
-				adapter = new LumberjackClient(configManager.getConfig().getNetwork().getSslCA(),serverAndPort[0],Integer.parseInt(serverAndPort[1]));
+				adapter = new LumberjackClient(configManager.getConfig().getNetwork().getSslCA(),serverAndPort[0],Integer.parseInt(serverAndPort[1]), networkTimeout);
 				reader.setAdapter(adapter);
 				reader.setAdapter(adapter);
 			} catch(Exception ex) {
 			} catch(Exception ex) {
 				logger.error("Failed to connect to server " + serverList.get(randomServerIndex) + " : " + ex.getMessage());
 				logger.error("Failed to connect to server " + serverList.get(randomServerIndex) + " : " + ex.getMessage());

+ 17 - 10
src/main/java/info/fetter/logstashforwarder/protocol/LumberjackClient.java

@@ -27,16 +27,19 @@ import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.DataOutputStream;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ProtocolException;
 import java.net.ProtocolException;
+import java.net.Socket;
 import java.security.KeyStore;
 import java.security.KeyStore;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.zip.Deflater;
 import java.util.zip.Deflater;
 
 
-import javax.net.SocketFactory;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocket;
+import javax.net.ssl.SSLSocketFactory;
 import javax.net.ssl.TrustManagerFactory;
 import javax.net.ssl.TrustManagerFactory;
 
 
 import org.apache.commons.io.HexDump;
 import org.apache.commons.io.HexDump;
@@ -50,7 +53,8 @@ public class LumberjackClient implements ProtocolAdapter {
 	private final static byte FRAME_DATA = 0x44;
 	private final static byte FRAME_DATA = 0x44;
 	private final static byte FRAME_COMPRESSED = 0x43;
 	private final static byte FRAME_COMPRESSED = 0x43;
 
 
-	private SSLSocket socket;
+	private Socket socket;
+	private SSLSocket sslSocket;
 	private KeyStore keyStore;
 	private KeyStore keyStore;
 	private String server;
 	private String server;
 	private int port;
 	private int port;
@@ -58,7 +62,7 @@ public class LumberjackClient implements ProtocolAdapter {
 	private DataInputStream input;
 	private DataInputStream input;
 	private int sequence = 1;
 	private int sequence = 1;
 
 
-	public LumberjackClient(String keyStorePath, String server, int port) throws IOException {
+	public LumberjackClient(String keyStorePath, String server, int port, int timeout) throws IOException {
 		this.server = server;
 		this.server = server;
 		this.port = port;
 		this.port = port;
 
 
@@ -72,13 +76,16 @@ public class LumberjackClient implements ProtocolAdapter {
 			SSLContext context = SSLContext.getInstance("TLS");
 			SSLContext context = SSLContext.getInstance("TLS");
 			context.init(null, tmf.getTrustManagers(), null);
 			context.init(null, tmf.getTrustManagers(), null);
 
 
-			SocketFactory socketFactory = context.getSocketFactory();
-			socket = (SSLSocket)socketFactory.createSocket(this.server, this.port);
-			socket.setUseClientMode(true);
-			socket.startHandshake();
+			SSLSocketFactory socketFactory = context.getSocketFactory();
+			socket = new Socket();
+			socket.connect(new InetSocketAddress(InetAddress.getByName(server), port), timeout);
+			socket.setSoTimeout(timeout);
+			sslSocket = (SSLSocket)socketFactory.createSocket(socket, server, port, true);
+			sslSocket.setUseClientMode(true);
+			sslSocket.startHandshake();
 
 
-			output = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
-			input = new DataInputStream(socket.getInputStream());
+			output = new DataOutputStream(new BufferedOutputStream(sslSocket.getOutputStream()));
+			input = new DataInputStream(sslSocket.getInputStream());
 
 
 			logger.info("Connected to " + server + ":" + port);
 			logger.info("Connected to " + server + ":" + port);
 		} catch(IOException e) {
 		} catch(IOException e) {
@@ -198,7 +205,7 @@ public class LumberjackClient implements ProtocolAdapter {
 
 
 	public void close() throws AdapterException {
 	public void close() throws AdapterException {
 		try {
 		try {
-			socket.close();
+			sslSocket.close();
 		} catch(Exception e) {
 		} catch(Exception e) {
 			throw new AdapterException(e);
 			throw new AdapterException(e);
 		}
 		}