diff --git a/src/main/java/com/github/nkzawa/socketio/client/Manager.java b/src/main/java/com/github/nkzawa/socketio/client/Manager.java index c3300c2..dda72ac 100644 --- a/src/main/java/com/github/nkzawa/socketio/client/Manager.java +++ b/src/main/java/com/github/nkzawa/socketio/client/Manager.java @@ -94,8 +94,8 @@ public class Manager extends Emitter { */ private ConcurrentHashMap nsps; - private ScheduledExecutorService timeoutScheduler = Executors.newSingleThreadScheduledExecutor(); - private ScheduledExecutorService reconnectScheduler = Executors.newSingleThreadScheduledExecutor(); + private ScheduledExecutorService timeoutScheduler; + private ScheduledExecutorService reconnectScheduler; public Manager() { @@ -251,7 +251,7 @@ public class Manager extends Emitter { final long timeout = Manager.this._timeout; logger.fine(String.format("connection attempt will timeout after %d", timeout)); - final Future timer = timeoutScheduler.schedule(new Runnable() { + final Future timer = getTimeoutScheduler().schedule(new Runnable() { @Override public void run() { EventThread.exec(new Runnable() { @@ -421,6 +421,14 @@ public class Manager extends Emitter { this.cleanup(); this.readyState = ReadyState.CLOSED; this.emit(EVENT_CLOSE, reason); + + if (this.timeoutScheduler != null) { + this.timeoutScheduler.shutdown(); + } + if (this.reconnectScheduler != null) { + this.reconnectScheduler.shutdown(); + } + if (this._reconnection && !this.skipReconnect) { this.reconnect(); } @@ -442,7 +450,7 @@ public class Manager extends Emitter { logger.fine(String.format("will wait %dms before reconnect attempt", delay)); this.reconnecting = true; - final Future timer = this.reconnectScheduler.schedule(new Runnable() { + final Future timer = this.getReconnectScheduler().schedule(new Runnable() { @Override public void run() { EventThread.exec(new Runnable() { @@ -486,6 +494,20 @@ public class Manager extends Emitter { this.emitAll(EVENT_RECONNECT, attempts); } + private ScheduledExecutorService getTimeoutScheduler() { + if (this.timeoutScheduler == null || this.timeoutScheduler.isShutdown()) { + this.timeoutScheduler = Executors.newSingleThreadScheduledExecutor(); + } + return timeoutScheduler; + } + + private ScheduledExecutorService getReconnectScheduler() { + if (this.reconnectScheduler == null || this.reconnectScheduler.isShutdown()) { + this.reconnectScheduler = Executors.newSingleThreadScheduledExecutor(); + } + return this.reconnectScheduler; + } + public static interface OpenCallback {