1919import org .springframework .beans .factory .ObjectProvider ;
2020import org .springframework .beans .factory .config .ConfigurableListableBeanFactory ;
2121import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
22- import org .springframework .boot .autoconfigure .data .redis .LettuceClientConfigurationBuilderCustomizer ;
23- import org .springframework .boot .autoconfigure .data .redis .LettuceClientOptionsBuilderCustomizer ;
24- import org .springframework .boot .autoconfigure .data .redis .RedisConnectionDetails ;
25- import org .springframework .boot .autoconfigure .data .redis .RedisProperties ;
22+ import org .springframework .boot .autoconfigure .data .redis .*;
2623import org .springframework .boot .ssl .SslBundles ;
2724import org .springframework .core .task .SimpleAsyncTaskExecutor ;
2825import org .springframework .data .redis .connection .RedisClusterConfiguration ;
26+ import org .springframework .data .redis .connection .RedisConnectionFactory ;
2927import org .springframework .data .redis .connection .RedisSentinelConfiguration ;
3028import org .springframework .data .redis .connection .RedisStandaloneConfiguration ;
3129import org .springframework .data .redis .connection .lettuce .LettuceConnectionFactory ;
30+ import org .springframework .data .redis .connection .jedis .JedisConnectionFactory ;
3231import org .springframework .util .ClassUtils ;
3332
3433import java .lang .reflect .Constructor ;
3534import java .lang .reflect .InvocationTargetException ;
3635import java .lang .reflect .Method ;
36+ import java .util .Objects ;
3737
3838/**
39- * Dynamically create multiple {@link RedisConnectionDetails} and {@link LettuceConnectionFactory} based on Environment.
39+ * Dynamically create multiple {@link RedisConnectionDetails} and {@link LettuceConnectionFactory} or {@link JedisConnectionFactory} based on Environment.
4040 *
4141 * @author ChildrenGreens
4242 */
43- public class LettuceConnectionMultiSourcesRegistrar extends AbstractMultiSourcesRegistrar <RedisProperties > {
43+ public class RedisConnectionMultiSourcesRegistrar extends AbstractMultiSourcesRegistrar <RedisProperties > {
4444
4545
4646 private static final String redisConnectionDetailsClassName = "org.springframework.boot.autoconfigure.data.redis.PropertiesRedisConnectionDetails" ;
4747
4848 private static final String lettuceConnectionConfigurationClassName = "org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration" ;
4949
50+ private static final String jedisConnectionConfigurationClassName = "org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration" ;
51+
52+ private static final boolean JEDIS_AVAILABLE = ClassUtils .isPresent ("redis.clients.jedis.Jedis" , ClassUtils .getDefaultClassLoader ());
53+
54+
5055 @ Override
5156 void registerBeanDefinitionsForSource (String name , RedisProperties source , BeanDefinitionRegistry registry , Boolean isPrimary ) {
5257
@@ -59,24 +64,29 @@ void registerBeanDefinitionsForSource(String name, RedisProperties source, BeanD
5964 isPrimary ,
6065 () -> (RedisConnectionDetails ) newInstance (redisConnectionDetailsClassName , new Class []{RedisProperties .class }, source ));
6166
67+ // JedisConnectionFactory or LettuceConnectionFactory
68+ boolean isJedisConnectionFactory = Objects .nonNull (source .getClientType ())
69+ && source .getClientType () == RedisProperties .ClientType .JEDIS
70+ && JEDIS_AVAILABLE ;
71+ Class <? extends RedisConnectionFactory > redisConnectionFactory = isJedisConnectionFactory ? JedisConnectionFactory .class : LettuceConnectionFactory .class ;
6272
63- // register LettuceConnectionFactory
73+ // register RedisConnectionFactory
6474 registerBeanDefinition (registry ,
65- LettuceConnectionFactory .class ,
66- generateBeanName (LettuceConnectionFactory . class , name ),
75+ RedisConnectionFactory .class ,
76+ generateBeanName (redisConnectionFactory , name ),
6777 isPrimary ,
6878 () -> {
69- // new LettuceConnectionConfiguration
79+ // new JedisConnectionFactory or LettuceConnectionFactory
7080 RedisConnectionDetails connectionDetails = beanFactory .getBean (redisConnectionDetailsBeanName , RedisConnectionDetails .class );
7181 ObjectProvider <RedisStandaloneConfiguration > standaloneProvider = beanFactory .getBeanProvider (RedisStandaloneConfiguration .class );
7282 ObjectProvider <RedisSentinelConfiguration > sentinelProvider = beanFactory .getBeanProvider (RedisSentinelConfiguration .class );
7383 ObjectProvider <RedisClusterConfiguration > clusterProvider = beanFactory .getBeanProvider (RedisClusterConfiguration .class );
7484 ObjectProvider <SslBundles > sslBundlesProvider = beanFactory .getBeanProvider (SslBundles .class );
7585
7686 try {
77- Class <?> clazz = ClassUtils .forName (lettuceConnectionConfigurationClassName , ClassUtils .getDefaultClassLoader ());
87+ String connectionConfigurationClassName = isJedisConnectionFactory ? lettuceConnectionConfigurationClassName : jedisConnectionConfigurationClassName ;
88+ Class <?> clazz = ClassUtils .forName (connectionConfigurationClassName , ClassUtils .getDefaultClassLoader ());
7889 Constructor <?> constructor = clazz .getDeclaredConstructors ()[0 ];
79- Method createConnectionFactory = clazz .getDeclaredMethod ("createConnectionFactory" , ObjectProvider .class , ObjectProvider .class , ClientResources .class );
8090 constructor .setAccessible (true );
8191 Object configuration = constructor .newInstance (source ,
8292 standaloneProvider ,
@@ -86,19 +96,33 @@ void registerBeanDefinitionsForSource(String name, RedisProperties source, BeanD
8696 sslBundlesProvider );
8797
8898
89- ObjectProvider <LettuceClientConfigurationBuilderCustomizer > clientConfigurationBuilderCustomizers = beanFactory .getBeanProvider (LettuceClientConfigurationBuilderCustomizer .class );
90- ObjectProvider <LettuceClientOptionsBuilderCustomizer > clientOptionsBuilderCustomizers = beanFactory .getBeanProvider (LettuceClientOptionsBuilderCustomizer .class );
91- ClientResources clientResources = beanFactory .getBean (ClientResources .class );
92-
93- createConnectionFactory .setAccessible (true );
94- LettuceConnectionFactory factory = (LettuceConnectionFactory ) createConnectionFactory .invoke (configuration , clientConfigurationBuilderCustomizers , clientOptionsBuilderCustomizers , clientResources );
95-
96- if (isVirtualThreads ()) {
97- SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor ("redis-" );
98- executor .setVirtualThreads (true );
99- factory .setExecutor (executor );
99+ if (isJedisConnectionFactory ) {
100+ ObjectProvider <JedisClientConfigurationBuilderCustomizer > builderCustomizers = beanFactory .getBeanProvider (JedisClientConfigurationBuilderCustomizer .class );
101+
102+ Method createJedisConnectionFactory = clazz .getDeclaredMethod ("createJedisConnectionFactory" , ObjectProvider .class );
103+ createJedisConnectionFactory .setAccessible (true );
104+ JedisConnectionFactory factory = (JedisConnectionFactory ) createJedisConnectionFactory .invoke (configuration , builderCustomizers );
105+ if (isVirtualThreads ()) {
106+ SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor ("redis-" );
107+ executor .setVirtualThreads (true );
108+ factory .setExecutor (executor );
109+ }
110+ return factory ;
111+ } else {
112+ ObjectProvider <LettuceClientConfigurationBuilderCustomizer > clientConfigurationBuilderCustomizers = beanFactory .getBeanProvider (LettuceClientConfigurationBuilderCustomizer .class );
113+ ObjectProvider <LettuceClientOptionsBuilderCustomizer > clientOptionsBuilderCustomizers = beanFactory .getBeanProvider (LettuceClientOptionsBuilderCustomizer .class );
114+ ClientResources clientResources = beanFactory .getBean (ClientResources .class );
115+
116+ Method createConnectionFactory = clazz .getDeclaredMethod ("createConnectionFactory" , ObjectProvider .class , ObjectProvider .class , ClientResources .class );
117+ createConnectionFactory .setAccessible (true );
118+ LettuceConnectionFactory factory = (LettuceConnectionFactory ) createConnectionFactory .invoke (configuration , clientConfigurationBuilderCustomizers , clientOptionsBuilderCustomizers , clientResources );
119+ if (isVirtualThreads ()) {
120+ SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor ("redis-" );
121+ executor .setVirtualThreads (true );
122+ factory .setExecutor (executor );
123+ }
124+ return factory ;
100125 }
101- return factory ;
102126 } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
103127 ClassNotFoundException | NoSuchMethodException e ) {
104128 throw new RuntimeException (e );
0 commit comments