Skip to content

Commit 42ee325

Browse files
wpanassdeleuze
authored andcommitted
Add support for Spring Data Redis
1 parent 2ecc1f5 commit 42ee325

37 files changed

+1351
-0
lines changed

Diff for: autoconfigure-adapter/build.gradle.kts

+3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ dependencies {
1919
compileOnly("org.springframework.data:spring-data-mongodb")
2020
compileOnly("org.mongodb:mongodb-driver-reactivestreams")
2121
compileOnly("org.springframework.data:spring-data-cassandra")
22+
compileOnly("org.springframework.data:spring-data-redis")
23+
compileOnly("redis.clients:jedis")
24+
compileOnly("io.lettuce:lettuce-core")
2225
compileOnly("com.fasterxml.jackson.core:jackson-databind")
2326
compileOnly("com.samskivert:jmustache")
2427
compileOnly("org.springframework.data:spring-data-r2dbc")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Cluster;
5+
import org.springframework.context.ApplicationContextInitializer;
6+
import org.springframework.context.support.GenericApplicationContext;
7+
import org.springframework.data.redis.connection.RedisClusterConfiguration;
8+
9+
/**
10+
* {@link ApplicationContextInitializer} adapter for {@link RedisClusterConfiguration}
11+
*/
12+
public class ClusterInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
13+
private final Cluster cluster;
14+
15+
public ClusterInitializer(Cluster cluster) {
16+
this.cluster = cluster;
17+
}
18+
19+
@Override
20+
public void initialize(GenericApplicationContext context) {
21+
if (cluster != null) {
22+
context.registerBean(RedisClusterConfiguration.class, this::getRedisClusterConfiguration);
23+
}
24+
}
25+
26+
@NotNull
27+
private RedisClusterConfiguration getRedisClusterConfiguration() {
28+
final RedisClusterConfiguration configuration = new RedisClusterConfiguration(cluster.getNodes());
29+
configuration.setMaxRedirects(cluster.getMaxRedirects());
30+
return configuration;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import org.springframework.context.ApplicationContextInitializer;
4+
import org.springframework.context.support.GenericApplicationContext;
5+
import org.springframework.data.redis.connection.RedisClusterConfiguration;
6+
import org.springframework.data.redis.connection.RedisConnectionFactory;
7+
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
8+
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
9+
10+
import java.net.UnknownHostException;
11+
12+
/**
13+
* {@link ApplicationContextInitializer} adapter for {@link JedisConnectionConfiguration}
14+
*/
15+
public class JedisRedisInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
16+
private final RedisProperties redisProperties;
17+
18+
public JedisRedisInitializer(RedisProperties redisProperties) {
19+
this.redisProperties = redisProperties;
20+
}
21+
22+
@Override
23+
public void initialize(GenericApplicationContext context) {
24+
if (redisProperties.getJedis().getPool() != null) {
25+
context.registerBean(RedisConnectionFactory.class, () -> getJedisConnectionFactory(context));
26+
}
27+
}
28+
29+
private JedisConnectionFactory getJedisConnectionFactory(GenericApplicationContext context) {
30+
final JedisConnectionConfiguration configuration = new JedisConnectionConfiguration(redisProperties, context.getBeanProvider(RedisSentinelConfiguration.class), context.getBeanProvider(RedisClusterConfiguration.class));
31+
32+
try {
33+
return configuration.redisConnectionFactory(context.getBeanProvider(JedisClientConfigurationBuilderCustomizer.class));
34+
} catch (UnknownHostException e) {
35+
e.printStackTrace();
36+
}
37+
38+
return null;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import io.lettuce.core.resource.ClientResources;
4+
import io.lettuce.core.resource.DefaultClientResources;
5+
import org.springframework.context.ApplicationContextInitializer;
6+
import org.springframework.context.support.GenericApplicationContext;
7+
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
8+
import org.springframework.data.redis.connection.RedisClusterConfiguration;
9+
import org.springframework.data.redis.connection.RedisConnectionFactory;
10+
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
11+
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
12+
13+
import java.net.UnknownHostException;
14+
15+
/**
16+
* {@link ApplicationContextInitializer} adapter for {@link LettuceConnectionConfiguration}
17+
*/
18+
public class LettuceRedisInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
19+
private final RedisProperties redisProperties;
20+
21+
public LettuceRedisInitializer(RedisProperties redisProperties) {
22+
this.redisProperties = redisProperties;
23+
}
24+
25+
@Override
26+
public void initialize(GenericApplicationContext context) {
27+
if (redisProperties.getLettuce().getPool() != null) {
28+
context.registerBean(RedisConnectionFactory.class, () -> getLettuceConnectionFactory(context));
29+
context.registerBean(ReactiveRedisConnectionFactory.class, () -> getLettuceConnectionFactory(context));
30+
}
31+
}
32+
33+
private LettuceConnectionFactory getLettuceConnectionFactory(GenericApplicationContext context) {
34+
final LettuceConnectionConfiguration configuration = new LettuceConnectionConfiguration(redisProperties, context.getBeanProvider(RedisSentinelConfiguration.class), context.getBeanProvider(RedisClusterConfiguration.class));
35+
final ClientResources clientResources = DefaultClientResources.create();
36+
try {
37+
return configuration.redisConnectionFactory(context.getBeanProvider(LettuceClientConfigurationBuilderCustomizer.class), clientResources);
38+
} catch (UnknownHostException e) {
39+
e.printStackTrace();
40+
}
41+
return null;
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import org.springframework.beans.factory.support.RootBeanDefinition;
4+
import org.springframework.context.ApplicationContextInitializer;
5+
import org.springframework.context.support.GenericApplicationContext;
6+
import org.springframework.core.ResolvableType;
7+
import org.springframework.data.redis.connection.RedisConnectionFactory;
8+
import org.springframework.data.redis.core.RedisTemplate;
9+
import org.springframework.data.redis.core.StringRedisTemplate;
10+
11+
import java.net.UnknownHostException;
12+
13+
/**
14+
* {@link ApplicationContextInitializer} adapter for {@link RedisAutoConfiguration}
15+
*/
16+
public class RedisInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
17+
@Override
18+
public void initialize(GenericApplicationContext context) {
19+
context.registerBeanDefinition("redisTemplate", getRedisTemplateBeanDefinition(context));
20+
context.registerBean("stringRedisTemplate", StringRedisTemplate.class, () -> getStringRedisTemplate(context));
21+
}
22+
23+
private RootBeanDefinition getRedisTemplateBeanDefinition(GenericApplicationContext context) {
24+
RootBeanDefinition beanDefinition = new RootBeanDefinition(RedisTemplate.class, () -> getRedisTemplate(context));
25+
beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(RedisTemplate.class, Object.class, Object.class));
26+
return beanDefinition;
27+
}
28+
29+
private RedisTemplate<?, ?> getRedisTemplate(GenericApplicationContext context) {
30+
RedisAutoConfiguration redisAutoConfiguration = new RedisAutoConfiguration();
31+
try {
32+
return redisAutoConfiguration.redisTemplate(context.getBean(RedisConnectionFactory.class));
33+
} catch (UnknownHostException e) {
34+
e.printStackTrace();
35+
}
36+
return null;
37+
}
38+
39+
private StringRedisTemplate getStringRedisTemplate(GenericApplicationContext context) {
40+
RedisAutoConfiguration redisAutoConfiguration = new RedisAutoConfiguration();
41+
try {
42+
return redisAutoConfiguration.stringRedisTemplate(context.getBean(RedisConnectionFactory.class));
43+
} catch (UnknownHostException e) {
44+
e.printStackTrace();
45+
}
46+
return null;
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import org.springframework.beans.factory.support.RootBeanDefinition;
4+
import org.springframework.context.ApplicationContextInitializer;
5+
import org.springframework.context.support.GenericApplicationContext;
6+
import org.springframework.core.ResolvableType;
7+
import org.springframework.core.io.ResourceLoader;
8+
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
9+
import org.springframework.data.redis.core.ReactiveRedisTemplate;
10+
import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
11+
12+
/**
13+
* {@link ApplicationContextInitializer} adapter for {@link RedisReactiveAutoConfiguration}
14+
*/
15+
public class RedisReactiveInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
16+
@Override
17+
public void initialize(GenericApplicationContext context) {
18+
context.registerBeanDefinition("reactiveRedisTemplate", getReactiveRedisTemplateBeanDefinition(context));
19+
context.registerBean("reactiveStringRedisTemplate", ReactiveStringRedisTemplate.class, () -> getReactiveStringRedisTemplate(context));
20+
}
21+
22+
private RootBeanDefinition getReactiveRedisTemplateBeanDefinition(GenericApplicationContext context) {
23+
RootBeanDefinition beanDefinition = new RootBeanDefinition(ReactiveRedisTemplate.class, () -> getReactiveRedisTemplate(context));
24+
beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(ReactiveRedisTemplate.class, Object.class, Object.class));
25+
return beanDefinition;
26+
}
27+
28+
private ReactiveStringRedisTemplate getReactiveStringRedisTemplate(GenericApplicationContext context) {
29+
RedisReactiveAutoConfiguration configuration = new RedisReactiveAutoConfiguration();
30+
return configuration.reactiveStringRedisTemplate(context.getBean(ReactiveRedisConnectionFactory.class));
31+
}
32+
33+
private ReactiveRedisTemplate<Object, Object> getReactiveRedisTemplate(GenericApplicationContext context) {
34+
RedisReactiveAutoConfiguration configuration = new RedisReactiveAutoConfiguration();
35+
36+
return configuration.reactiveRedisTemplate(context.getBean(ReactiveRedisConnectionFactory.class), context.getBean(ResourceLoader.class));
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.springframework.boot.autoconfigure.data.redis;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.springframework.context.ApplicationContextInitializer;
5+
import org.springframework.context.support.GenericApplicationContext;
6+
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
7+
8+
import java.util.HashSet;
9+
10+
/**
11+
* {@link ApplicationContextInitializer} adapter for {@link RedisSentinelConfiguration}
12+
*/
13+
public class SentinelInitializer implements ApplicationContextInitializer<GenericApplicationContext> {
14+
private final RedisProperties.Sentinel sentinel;
15+
16+
public SentinelInitializer(RedisProperties.Sentinel sentinel) {
17+
this.sentinel = sentinel;
18+
}
19+
20+
@Override
21+
public void initialize(GenericApplicationContext context) {
22+
if (sentinel != null) {
23+
context.registerBean(RedisSentinelConfiguration.class, this::getRedisSentinelConfiguration);
24+
}
25+
}
26+
27+
@NotNull
28+
private RedisSentinelConfiguration getRedisSentinelConfiguration() {
29+
return new RedisSentinelConfiguration(sentinel.getMaster(), new HashSet<>(sentinel.getNodes()));
30+
}
31+
}

Diff for: build.gradle.kts

+13
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,19 @@ publishing {
154154
})
155155
}
156156

157+
create<MavenPublication>("kofu-reactive-redis") {
158+
groupId = "org.springframework.fu"
159+
artifactId = "spring-fu-samples-kofu-reactive-redis"
160+
artifact(task<Zip>("kofuReactiveRedisSampleZip") {
161+
from("samples/kofu-reactive-redis") {
162+
exclude("build", ".gradle", ".idea", "out", "*.iml")
163+
}
164+
destinationDir = file("$buildDir/dist")
165+
into("kofu-reactive-redis")
166+
setExecutablePermissions()
167+
})
168+
}
169+
157170
create<MavenPublication>("kofu-reactive-cassandra") {
158171
groupId = "org.springframework.fu"
159172
artifactId = "spring-fu-samples-kofu-reactive-cassandra"

Diff for: kofu/build.gradle.kts

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
compileOnly("org.springframework.data:spring-data-mongodb")
2222
compileOnly("org.mongodb:mongodb-driver-reactivestreams")
2323
compileOnly("org.springframework.data:spring-data-cassandra")
24+
compileOnly("org.springframework.data:spring-data-redis")
2425
compileOnly("com.fasterxml.jackson.core:jackson-databind")
2526
compileOnly("com.samskivert:jmustache")
2627
compileOnly("io.projectreactor.kotlin:reactor-kotlin-extensions")
@@ -39,11 +40,15 @@ dependencies {
3940
testImplementation("org.springframework.boot:spring-boot-starter-json")
4041
testImplementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
4142
testImplementation("org.springframework.boot:spring-boot-starter-data-cassandra-reactive")
43+
testImplementation("org.springframework.boot:spring-boot-starter-data-redis-reactive")
4244
testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin")
4345
testRuntimeOnly("de.flapdoodle.embed:de.flapdoodle.embed.mongo")
4446
testImplementation("io.mockk:mockk:1.9")
4547
testImplementation("io.projectreactor.kotlin:reactor-kotlin-extensions")
4648
testImplementation("javax.servlet:javax.servlet-api")
49+
testCompile("org.testcontainers:testcontainers:1.11.3")
50+
testImplementation("redis.clients:jedis")
51+
testImplementation("io.lettuce:lettuce-core")
4752
}
4853

4954
tasks.withType<DokkaTask> {

0 commit comments

Comments
 (0)