Skip to content

Commit d298404

Browse files
Add JedisConnectionFactory
Updating Spring boot v3.4.1
1 parent 6b477b7 commit d298404

File tree

7 files changed

+65
-34
lines changed

7 files changed

+65
-34
lines changed

README.adoc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ To use Redis multi-data sources, you need to add the Redis Multi Sources Spring
1717
<dependency>
1818
<groupId>com.childrengreens</groupId>
1919
<artifactId>redis-multi-source-spring-boot-starter</artifactId>
20-
<version>2.1</version>
20+
<version>2.2</version>
2121
</dependency>
2222
----
2323
Add the following configuration to your properties file.
@@ -121,7 +121,7 @@ To use RabbitMQ multi-data sources, you need to add the AMQP Multi Sources Sprin
121121
<dependency>
122122
<groupId>com.childrengreens</groupId>
123123
<artifactId>amqp-multi-source-spring-boot-starter</artifactId>
124-
<version>2.1</version>
124+
<version>2.2</version>
125125
</dependency>
126126
----
127127
Add the following configuration to your properties file.

amqp-multi-source-spring-boot-starter/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.childrengreens</groupId>
99
<artifactId>multi-source-spring-boot-starter</artifactId>
10-
<version>2.1</version>
10+
<version>2.2</version>
1111
</parent>
1212

1313
<artifactId>amqp-multi-source-spring-boot-starter</artifactId>
@@ -36,7 +36,7 @@
3636
<dependency>
3737
<groupId>com.childrengreens</groupId>
3838
<artifactId>context-multi-source-spring-boot-starter</artifactId>
39-
<version>2.1</version>
39+
<version>2.2</version>
4040
</dependency>
4141
</dependencies>
4242
</project>

context-multi-source-spring-boot-starter/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.childrengreens</groupId>
99
<artifactId>multi-source-spring-boot-starter</artifactId>
10-
<version>2.1</version>
10+
<version>2.2</version>
1111
</parent>
1212

1313
<artifactId>context-multi-source-spring-boot-starter</artifactId>

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.childrengreens</groupId>
88
<artifactId>multi-source-spring-boot-starter</artifactId>
9-
<version>2.1</version>
9+
<version>2.2</version>
1010
<packaging>pom</packaging>
1111

1212
<name>Spring Boot Starter for Multi Source</name>
@@ -66,7 +66,7 @@
6666
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
6767
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
6868

69-
<spring-boot-dependencies.version>3.4.0</spring-boot-dependencies.version>
69+
<spring-boot-dependencies.version>3.4.1</spring-boot-dependencies.version>
7070
</properties>
7171

7272
<dependencyManagement>

redis-multi-source-spring-boot-starter/pom.xml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>com.childrengreens</groupId>
99
<artifactId>multi-source-spring-boot-starter</artifactId>
10-
<version>2.1</version>
10+
<version>2.2</version>
1111
</parent>
1212

1313
<artifactId>redis-multi-source-spring-boot-starter</artifactId>
@@ -37,14 +37,21 @@
3737
<dependency>
3838
<groupId>com.childrengreens</groupId>
3939
<artifactId>context-multi-source-spring-boot-starter</artifactId>
40-
<version>2.1</version>
40+
<version>2.2</version>
4141
</dependency>
4242

4343
<dependency>
4444
<groupId>org.apache.commons</groupId>
4545
<artifactId>commons-pool2</artifactId>
4646
<optional>true</optional>
4747
</dependency>
48+
49+
50+
<dependency>
51+
<groupId>redis.clients</groupId>
52+
<artifactId>jedis</artifactId>
53+
<optional>true</optional>
54+
</dependency>
4855
</dependencies>
4956

5057

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,34 +19,39 @@
1919
import org.springframework.beans.factory.ObjectProvider;
2020
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2121
import 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.*;
2623
import org.springframework.boot.ssl.SslBundles;
2724
import org.springframework.core.task.SimpleAsyncTaskExecutor;
2825
import org.springframework.data.redis.connection.RedisClusterConfiguration;
26+
import org.springframework.data.redis.connection.RedisConnectionFactory;
2927
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
3028
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
3129
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
30+
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
3231
import org.springframework.util.ClassUtils;
3332

3433
import java.lang.reflect.Constructor;
3534
import java.lang.reflect.InvocationTargetException;
3635
import 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);

redis-multi-source-spring-boot-starter/src/main/java/com/childrengreens/multi/source/RedisMultiSourcesAutoConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
*/
2929

3030
@AutoConfiguration(before = RedisAutoConfiguration.class)
31-
@Import({LettuceConnectionMultiSourcesRegistrar.class, RedisTemplateRegistryPostProcessor.class})
31+
@Import({RedisConnectionMultiSourcesRegistrar.class, RedisTemplateRegistryPostProcessor.class})
3232
public class RedisMultiSourcesAutoConfiguration {
3333

3434
}

0 commit comments

Comments
 (0)