Skip to content

Commit 7155c86

Browse files
committed
Return AbstractRedisClient from LettuceConnectionFactory.
Closes #1745
1 parent 3f0ef9c commit 7155c86

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

Diff for: src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java

+40-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
import org.apache.commons.logging.Log;
4646
import org.apache.commons.logging.LogFactory;
47+
4748
import org.springframework.beans.factory.DisposableBean;
4849
import org.springframework.beans.factory.InitializingBean;
4950
import org.springframework.dao.DataAccessException;
@@ -56,7 +57,6 @@
5657
import org.springframework.data.redis.connection.RedisConfiguration.DomainSocketConfiguration;
5758
import org.springframework.data.redis.connection.RedisConfiguration.WithDatabaseIndex;
5859
import org.springframework.data.redis.connection.RedisConfiguration.WithPassword;
59-
import org.springframework.data.redis.connection.lettuce.LettuceConnection.*;
6060
import org.springframework.data.util.Optionals;
6161
import org.springframework.lang.Nullable;
6262
import org.springframework.util.Assert;
@@ -788,6 +788,45 @@ public void setClientName(@Nullable String clientName) {
788788
this.getMutableConfiguration().setClientName(clientName);
789789
}
790790

791+
/**
792+
* Returns the native {@link AbstractRedisClient} used by this instance. The client is initialized as part of
793+
* {@link #afterPropertiesSet() the bean initialization lifecycle} and only available when this connection factory is
794+
* initialized.
795+
* <p/>
796+
* Depending on the configuration, the client can be either {@link RedisClient} or {@link RedisClusterClient}.
797+
*
798+
* @return the native {@link AbstractRedisClient}. Can be {@literal null} if not initialized.
799+
* @since 2.5
800+
* @see #afterPropertiesSet()
801+
*/
802+
@Nullable
803+
public AbstractRedisClient getNativeClient() {
804+
return this.client;
805+
}
806+
807+
/**
808+
* Returns the native {@link AbstractRedisClient} used by this instance. The client is initialized as part of
809+
* {@link #afterPropertiesSet() the bean initialization lifecycle} and only available when this connection factory is
810+
* initialized. Throws {@link IllegalStateException} if not yet initialized.
811+
* <p/>
812+
* Depending on the configuration, the client can be either {@link RedisClient} or {@link RedisClusterClient}.
813+
*
814+
* @return the native {@link AbstractRedisClient}.
815+
* @since 2.5
816+
* @throws IllegalStateException if not yet initialized.
817+
* @see #getNativeClient()
818+
*/
819+
public AbstractRedisClient getRequiredNativeClient() {
820+
821+
AbstractRedisClient client = getNativeClient();
822+
823+
if (client == null) {
824+
throw new IllegalStateException("Client not yet initialized");
825+
}
826+
827+
return client;
828+
}
829+
791830
@Nullable
792831
private String getRedisUsername() {
793832
return RedisConfiguration.getUsernameOrElse(configuration, standaloneConfig::getUsername);

Diff for: src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,31 @@ protected LettuceConnectionProvider doCreateConnectionProvider(AbstractRedisClie
989989
assertThat(reactiveConnection).isInstanceOf(LettuceReactiveRedisClusterConnection.class);
990990
}
991991

992+
@Test // GH-1745
993+
void getNativeClientShouldReturnClient() {
994+
995+
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
996+
connectionFactory.setClientResources(getSharedClientResources());
997+
connectionFactory.afterPropertiesSet();
998+
999+
assertThat(connectionFactory.getNativeClient()).isInstanceOf(RedisClient.class);
1000+
1001+
connectionFactory = new LettuceConnectionFactory(clusterConfig);
1002+
connectionFactory.setClientResources(getSharedClientResources());
1003+
connectionFactory.afterPropertiesSet();
1004+
1005+
assertThat(connectionFactory.getRequiredNativeClient()).isInstanceOf(RedisClusterClient.class);
1006+
}
1007+
1008+
@Test // GH-1745
1009+
void getNativeClientShouldFailIfNotInitialized() {
1010+
1011+
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
1012+
1013+
assertThatIllegalStateException().isThrownBy(connectionFactory::getRequiredNativeClient)
1014+
.withMessage("Client not yet initialized");
1015+
}
1016+
9921017
@Data
9931018
@AllArgsConstructor
9941019
static class CustomRedisConfiguration implements RedisConfiguration, WithHostAndPort {

0 commit comments

Comments
 (0)