diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index 66a5d0025..8da79fb26 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -805,6 +805,7 @@ public class LettuceConnectionFactory * @return the shared connection using {@literal byte} array encoding for imperative API use. {@literal null} if * {@link #getShareNativeConnection() connection sharing} is disabled. */ + @Nullable protected StatefulRedisConnection getSharedConnection() { return shareNativeConnection ? (StatefulRedisConnection) getOrCreateSharedConnection().getConnection() : null; } @@ -814,6 +815,7 @@ public class LettuceConnectionFactory * {@link #getShareNativeConnection() connection sharing} is disabled. * @since 2.0.1 */ + @Nullable protected StatefulConnection getSharedReactiveConnection() { return shareNativeConnection ? getOrCreateSharedReactiveConnection().getConnection() : null; } @@ -928,13 +930,14 @@ public class LettuceConnectionFactory * * @param connection encoding. * @author Mark Paluch + * @author Christoph Strobl * @since 2.1 */ @RequiredArgsConstructor class SharedConnection { private final LettuceConnectionProvider connectionProvider; - private final boolean clusterEnabled; + private final boolean shareNativeClusterConnection; /** Synchronization monitor for the shared Connection */ private final Object connectionMonitor = new Object(); @@ -947,6 +950,7 @@ public class LettuceConnectionFactory * * @return the connection. */ + @Nullable StatefulConnection getConnection() { synchronized (this.connectionMonitor) { @@ -968,20 +972,20 @@ public class LettuceConnectionFactory * * @return the connection. */ + @Nullable private StatefulConnection getNativeConnection() { try { - StatefulConnection connection; - - if ((isClusterAware() && clusterEnabled) || !isClusterAware()) { - connection = connectionProvider.getConnection(StatefulConnection.class); - if (connection instanceof StatefulRedisConnection && getDatabase() > 0) { - ((StatefulRedisConnection) connection).sync().select(getDatabase()); - } - } else { - connection = null; + if (isClusterAware() && !shareNativeClusterConnection) { + return null; } + + StatefulConnection connection = connectionProvider.getConnection(StatefulConnection.class); + if (connection instanceof StatefulRedisConnection && getDatabase() > 0) { + ((StatefulRedisConnection) connection).sync().select(getDatabase()); + } + return connection; } catch (RedisException e) { throw new RedisConnectionFailureException("Unable to connect to Redis", e); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisConnection.java index 9444e106f..defee08c0 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveRedisConnection.java @@ -317,6 +317,7 @@ class LettuceReactiveRedisConnection implements ReactiveRedisConnection { * * * @author Mark Paluch + * @author Christoph Strobl * @since 2.0.1 */ static class AsyncConnect { @@ -345,12 +346,12 @@ class LettuceReactiveRedisConnection implements ReactiveRedisConnection { * Obtain a connection publisher. This method connects asynchronously by requesting a connection from * {@link LettuceConnectionProvider} with non-blocking synchronization if called concurrently. * - * @return + * @return never {@literal null}. */ Mono> getConnection() { if (state.get() == State.CLOSED) { - throw new IllegalStateException("Connection is closed!"); + throw new IllegalStateException("Unable to connect. Connection is closed!"); } CompletableFuture> connection = this.connection; @@ -363,7 +364,7 @@ class LettuceReactiveRedisConnection implements ReactiveRedisConnection { this.connection = connectionPublisher.toFuture(); } - for (;;) { + while (true) { connection = this.connection; if (connection != null) {