diff --git a/src/main/java/info/fetter/logstashforwarder/Forwarder.java b/src/main/java/info/fetter/logstashforwarder/Forwarder.java index 809b83b..698057a 100644 --- a/src/main/java/info/fetter/logstashforwarder/Forwarder.java +++ b/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 int spoolSize = 1024; private static int idleTimeout = 5000; + private static int networkTimeout = 15000; private static String config; private static ConfigurationManager configManager; private static FileWatcher watcher; @@ -91,7 +92,7 @@ public class Forwarder { Thread.sleep(idleTimeout); } catch(AdapterException e) { logger.error("Lost server connection"); - Thread.sleep(configManager.getConfig().getNetwork().getTimeout() * 1000); + Thread.sleep(networkTimeout); connectToServer(); } } @@ -100,6 +101,7 @@ public class Forwarder { private static void connectToServer() { int randomServerIndex = 0; List serverList = configManager.getConfig().getNetwork().getServers(); + networkTimeout = configManager.getConfig().getNetwork().getTimeout() * 1000; if(adapter != null) { try { adapter.close(); @@ -114,7 +116,7 @@ public class Forwarder { randomServerIndex = random.nextInt(serverList.size()); String[] serverAndPort = serverList.get(randomServerIndex).split(":"); 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); } catch(Exception ex) { logger.error("Failed to connect to server " + serverList.get(randomServerIndex) + " : " + ex.getMessage()); diff --git a/src/main/java/info/fetter/logstashforwarder/protocol/LumberjackClient.java b/src/main/java/info/fetter/logstashforwarder/protocol/LumberjackClient.java index 0511363..2c63a32 100644 --- a/src/main/java/info/fetter/logstashforwarder/protocol/LumberjackClient.java +++ b/src/main/java/info/fetter/logstashforwarder/protocol/LumberjackClient.java @@ -27,16 +27,19 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.net.ProtocolException; +import java.net.Socket; import java.security.KeyStore; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.zip.Deflater; -import javax.net.SocketFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory; 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_COMPRESSED = 0x43; - private SSLSocket socket; + private Socket socket; + private SSLSocket sslSocket; private KeyStore keyStore; private String server; private int port; @@ -58,7 +62,7 @@ public class LumberjackClient implements ProtocolAdapter { private DataInputStream input; 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.port = port; @@ -72,13 +76,16 @@ public class LumberjackClient implements ProtocolAdapter { SSLContext context = SSLContext.getInstance("TLS"); 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); } catch(IOException e) { @@ -198,7 +205,7 @@ public class LumberjackClient implements ProtocolAdapter { public void close() throws AdapterException { try { - socket.close(); + sslSocket.close(); } catch(Exception e) { throw new AdapterException(e); }