diff --git a/redisson/src/main/java/org/redisson/client/RedisClient.java b/redisson/src/main/java/org/redisson/client/RedisClient.java index f9fe56c2e..bc2f9bfd3 100644 --- a/redisson/src/main/java/org/redisson/client/RedisClient.java +++ b/redisson/src/main/java/org/redisson/client/RedisClient.java @@ -94,6 +94,8 @@ public class RedisClient { bootstrap.handler(new RedisChannelInitializer(bootstrap, config, this, channels, type)); bootstrap.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, config.getConnectTimeout()); + bootstrap.option(ChannelOption.SO_KEEPALIVE, config.isKeepAlive()); + bootstrap.option(ChannelOption.TCP_NODELAY, config.isTcpNoDelay()); return bootstrap; } diff --git a/redisson/src/main/java/org/redisson/client/RedisClientConfig.java b/redisson/src/main/java/org/redisson/client/RedisClientConfig.java index cb3bb7428..90a1e5ea1 100644 --- a/redisson/src/main/java/org/redisson/client/RedisClientConfig.java +++ b/redisson/src/main/java/org/redisson/client/RedisClientConfig.java @@ -49,6 +49,9 @@ public class RedisClientConfig { private String clientName; private boolean readOnly; private boolean keepPubSubOrder = true; + private boolean pingConnection; + private boolean keepAlive; + private boolean tcpNoDelay; private boolean sslEnableEndpointIdentification = true; private SslProvider sslProvider = SslProvider.JDK; @@ -206,8 +209,33 @@ public class RedisClientConfig { public boolean isKeepPubSubOrder() { return keepPubSubOrder; } - public void setKeepPubSubOrder(boolean keepPubSubOrder) { + public RedisClientConfig setKeepPubSubOrder(boolean keepPubSubOrder) { this.keepPubSubOrder = keepPubSubOrder; + return this; + } + + public boolean isPingConnection() { + return pingConnection; + } + public RedisClientConfig setPingConnection(boolean pingConnection) { + this.pingConnection = pingConnection; + return this; + } + + public boolean isKeepAlive() { + return keepAlive; + } + public RedisClientConfig setKeepAlive(boolean keepAlive) { + this.keepAlive = keepAlive; + return this; } + public boolean isTcpNoDelay() { + return tcpNoDelay; + } + public RedisClientConfig setTcpNoDelay(boolean tcpNoDelay) { + this.tcpNoDelay = tcpNoDelay; + return this; + } + } diff --git a/redisson/src/main/java/org/redisson/client/handler/BaseConnectionHandler.java b/redisson/src/main/java/org/redisson/client/handler/BaseConnectionHandler.java index d085ea400..86bd71223 100644 --- a/redisson/src/main/java/org/redisson/client/handler/BaseConnectionHandler.java +++ b/redisson/src/main/java/org/redisson/client/handler/BaseConnectionHandler.java @@ -80,6 +80,10 @@ public abstract class BaseConnectionHandler extends C RFuture future = connection.async(RedisCommands.READONLY); futures.add(future); } + if (config.isPingConnection()) { + RFuture future = connection.async(RedisCommands.PING); + futures.add(future); + } if (futures.isEmpty()) { ctx.fireChannelActive(); diff --git a/redisson/src/main/java/org/redisson/config/BaseConfig.java b/redisson/src/main/java/org/redisson/config/BaseConfig.java index 5f89230ed..7278fd5db 100644 --- a/redisson/src/main/java/org/redisson/config/BaseConfig.java +++ b/redisson/src/main/java/org/redisson/config/BaseConfig.java @@ -105,6 +105,12 @@ class BaseConfig> { private String sslKeystorePassword; + private boolean pingConnection; + + private boolean keepAlive; + + private boolean tcpNoDelay; + BaseConfig() { } @@ -127,6 +133,9 @@ class BaseConfig> { setSslTruststorePassword(config.getSslTruststorePassword()); setSslKeystore(config.getSslKeystore()); setSslKeystorePassword(config.getSslKeystorePassword()); + setPingConnection(config.isPingConnection()); + setKeepAlive(config.isKeepAlive()); + setTcpNoDelay(config.isTcpNoDelay()); } /** @@ -332,7 +341,7 @@ class BaseConfig> { /** * Enables SSL endpoint identification. *

- * Default is true + * Default is true * * @param sslEnableEndpointIdentification - boolean value * @return config @@ -419,6 +428,57 @@ class BaseConfig> { return (T) this; } + public boolean isPingConnection() { + return pingConnection; + } + + /** + * Enables PING command sending during connection initialization + *

+ * Default is false + * + * @param pingConnection - boolean value + * @return config + */ + public T setPingConnection(boolean pingConnection) { + this.pingConnection = pingConnection; + return (T) this; + } + + public boolean isKeepAlive() { + return keepAlive; + } + + /** + * Enables TCP keepAlive for connection + *

+ * Default is false + * + * @param keepAlive - boolean value + * @return config + */ + public T setKeepAlive(boolean keepAlive) { + this.keepAlive = keepAlive; + return (T) this; + } + + public boolean isTcpNoDelay() { + return tcpNoDelay; + } + + /** + * Enables TCP noDelay for connection + *

+ * Default is false + * + * @param tcpNoDelay - boolean value + * @return config + */ + public T setTcpNoDelay(boolean tcpNoDelay) { + this.tcpNoDelay = tcpNoDelay; + return (T) this; + } + } diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 69e357742..98c9c671f 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -377,7 +377,10 @@ public class MasterSlaveConnectionManager implements ConnectionManager { .setSslKeystore(config.getSslKeystore()) .setSslKeystorePassword(config.getSslKeystorePassword()) .setClientName(config.getClientName()) - .setKeepPubSubOrder(cfg.isKeepPubSubOrder()); + .setKeepPubSubOrder(cfg.isKeepPubSubOrder()) + .setPingConnection(config.isPingConnection()) + .setKeepAlive(config.isKeepAlive()) + .setTcpNoDelay(config.isTcpNoDelay()); if (type != NodeType.SENTINEL) { redisConfig.setDatabase(config.getDatabase());