From 8209d2a29ba9ec1e39132b53938e3765f9e41a5a Mon Sep 17 00:00:00 2001 From: Philipp Marx Date: Thu, 10 Nov 2016 14:02:32 +0100 Subject: [PATCH] Don't close shared instances of ExecutorService or EventLoopGroup --- .../main/java/org/redisson/config/Config.java | 6 ++++- .../MasterSlaveConnectionManager.java | 23 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/redisson/src/main/java/org/redisson/config/Config.java b/redisson/src/main/java/org/redisson/config/Config.java index 0992b1e69..11cc0cb53 100644 --- a/redisson/src/main/java/org/redisson/config/Config.java +++ b/redisson/src/main/java/org/redisson/config/Config.java @@ -440,7 +440,9 @@ public class Config { * Use external ExecutorService. ExecutorService processes * all listeners of RTopic, * RRemoteService invocation handlers - * and RExecutorService tasks. + * and RExecutorService tasks. + *

+ * The caller is responsible for closing the ExecutorService. * * @param executor object * @return config @@ -463,6 +465,8 @@ public class Config { *

* Only {@link io.netty.channel.epoll.EpollEventLoopGroup} or * {@link io.netty.channel.nio.NioEventLoopGroup} can be used. + *

+ * The caller is responsible for closing the EventLoopGroup. * * @param eventLoopGroup object * @return config diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 77527beb0..df78ed534 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -147,6 +147,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager { private final AsyncSemaphore freePubSubLock = new AsyncSemaphore(1); + private final boolean sharedEventLoopGroup; + + private final boolean sharedExecutor; + { for (int i = 0; i < locks.length; i++) { locks[i] = new AsyncSemaphore(1); @@ -198,6 +202,8 @@ public class MasterSlaveConnectionManager implements ConnectionManager { this.codec = cfg.getCodec(); this.shutdownPromise = newPromise(); + this.sharedEventLoopGroup = cfg.getEventLoopGroup() != null; + this.sharedExecutor = cfg.getExecutor() != null; } public boolean isClusterMode() { @@ -740,13 +746,18 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } timer.stop(); - executor.shutdown(); - try { - executor.awaitTermination(timeout, unit); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + if (!sharedExecutor) { + executor.shutdown(); + try { + executor.awaitTermination(timeout, unit); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + if (!sharedEventLoopGroup) { + group.shutdownGracefully(quietPeriod, timeout, unit).syncUninterruptibly(); } - group.shutdownGracefully(quietPeriod, timeout, unit).syncUninterruptibly(); } @Override