From 913f48b4aca893e0bbdf6771f30c46ca49feb95e Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 28 Nov 2017 07:24:07 -0800 Subject: [PATCH] Added reconnect logic --- README.md | 2 +- src/io/calidog/certstream/BoringParts.java | 48 +++++++++++++++++-- src/io/calidog/certstream/CertStream.java | 16 +++---- .../certstream/CertStreamClientImpl.java | 2 - 4 files changed, 51 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 05e8d24..fbc07d8 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Step 2: Add dependency to pom.xml: com.github.CaliDog certstream-java - 0.2 + 0.3 ``` diff --git a/src/io/calidog/certstream/BoringParts.java b/src/io/calidog/certstream/BoringParts.java index dd3946f..48484d1 100644 --- a/src/io/calidog/certstream/BoringParts.java +++ b/src/io/calidog/certstream/BoringParts.java @@ -1,11 +1,16 @@ package io.calidog.certstream; +import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Arrays; +import java.util.HashSet; +import java.util.function.Supplier; + /** - * The class that takes care of ll the boring parts + * The class that takes care of all the boring parts * of talking over WebSockets, most notably the onClose * which will get called if your internet connection * hiccups. @@ -15,7 +20,28 @@ public class BoringParts implements CertStreamCloseHandler, CertStreamOpenHandler { private static final Logger logger = LoggerFactory.getLogger(BoringParts.class); - private boolean notClosed = true; + private final long sleepBeforeReconnect; + + private HashSet recoverableCloseCodes = new HashSet<>(Arrays.asList(1001, 1005, 1006, 1009)); + + private final Supplier webSocketClientSupplier; + private WebSocketClient webSocketClient; + + private final CertStreamClientImplFactory defaultImplFactory = + new CertStreamClientImplFactory(this, + this, + this); + + public BoringParts(CertStreamStringMessageHandler handler) + { + this(handler, 0); + } + + public BoringParts(CertStreamStringMessageHandler messageHandler, long sleepBeforeReconnect) { + this.sleepBeforeReconnect = sleepBeforeReconnect; + this.webSocketClientSupplier = () -> defaultImplFactory.make(messageHandler); + webSocketClient = webSocketClientSupplier.get(); + } //todo reconnection logic @Override @@ -23,7 +49,21 @@ public void onClose(int i, String s, boolean b) { logger.warn("OnClose was called wih i = " + i + ", s = "+s + ", b = b"); System.out.println("OnClose was called wih i = " + i + ", s = "+s + ", b = b"); - notClosed = false; + if (recoverableCloseCodes.contains(i)) + { + if (sleepBeforeReconnect >= 0) + { + try { + Thread.yield(); + Thread.sleep(sleepBeforeReconnect); + } catch (InterruptedException e) { + logger.info("Thread sleep interrupted, weird, exiting", e); + return; + } + } + + webSocketClient = webSocketClientSupplier.get(); + } } @Override @@ -51,6 +91,6 @@ public void onOpen(ServerHandshake serverHandshake) { * @return whether or not onClose has been called */ public boolean isNotClosed() { - return notClosed; + return !webSocketClient.isClosed(); } } diff --git a/src/io/calidog/certstream/CertStream.java b/src/io/calidog/certstream/CertStream.java index 2369786..a4da9d6 100644 --- a/src/io/calidog/certstream/CertStream.java +++ b/src/io/calidog/certstream/CertStream.java @@ -15,13 +15,6 @@ public class CertStream{ private static final Logger logger = LoggerFactory.getLogger(CertStream.class); - private static BoringParts theBoringParts = new BoringParts(); - - private static CertStreamClientImplFactory defaultImplFactory = - new CertStreamClientImplFactory(theBoringParts, - theBoringParts, - theBoringParts); - /** * @param handler A {@link Consumer} that we'll * run in a Thread that stays alive as long @@ -31,14 +24,17 @@ public static void onMessageString(Consumer handler) { new Thread(() -> { - defaultImplFactory.make(handler::accept); + BoringParts theBoringParts = new BoringParts(handler::accept); while (theBoringParts.isNotClosed()) { Thread.yield(); try { - Thread.sleep(3000); - } catch (InterruptedException e) { + Thread.sleep(1000); + } catch (InterruptedException e) {} + + if (Thread.interrupted()) + { break; } } diff --git a/src/io/calidog/certstream/CertStreamClientImpl.java b/src/io/calidog/certstream/CertStreamClientImpl.java index 54b0bc4..668ac6b 100644 --- a/src/io/calidog/certstream/CertStreamClientImpl.java +++ b/src/io/calidog/certstream/CertStreamClientImpl.java @@ -7,11 +7,9 @@ import java.net.URISyntaxException; public class CertStreamClientImpl extends WebSocketClient{ - private static final String certStreamUriString = "wss://certstream.calidog.io"; private static URI tempUri = null; - static { try {