From de268d97e2941c08182f7af7066338426abe5dfd Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 4 May 2017 09:25:36 +0200 Subject: [PATCH] Add auto-configuration for reactive Redis This commit provides an auto-configuration for reactive Redis and a starter that provides Lettuce as Jedis doesn't support reactive operations. There are no support for reactive redis repositories at the moment so only a `ReactiveRedisTemplate` is auto-configured if necessary. Closes gh-8053 --- .../redis/RedisReactiveAutoConfiguration.java | 68 ++++++++++++++++++ .../main/resources/META-INF/spring.factories | 1 + .../RedisReactiveAutoConfigurationTests.java | 63 ++++++++++++++++ spring-boot-dependencies/pom.xml | 5 ++ .../main/asciidoc/spring-boot-features.adoc | 9 ++- spring-boot-starters/pom.xml | 1 + .../pom.xml | 71 +++++++++++++++++++ .../main/resources/META-INF/spring.provides | 1 + 8 files changed, 216 insertions(+), 3 deletions(-) create mode 100644 spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfiguration.java create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfigurationTests.java create mode 100644 spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml create mode 100644 spring-boot-starters/spring-boot-starter-data-redis-reactive/src/main/resources/META-INF/spring.provides diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfiguration.java new file mode 100644 index 00000000000..aa3c36aeb0e --- /dev/null +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfiguration.java @@ -0,0 +1,68 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.redis; + +import reactor.core.publisher.Flux; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ResourceLoader; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +/** + * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's reactive Redis + * support. + * + * @author Mark Paluch + * @author Stephane Nicoll + * @since 2.0.0 + */ +@Configuration +@ConditionalOnClass({ ReactiveRedisConnectionFactory.class, ReactiveRedisTemplate.class, + Flux.class }) +@AutoConfigureAfter(RedisAutoConfiguration.class) +public class RedisReactiveAutoConfiguration { + + @Bean + @ConditionalOnMissingBean(name = "reactiveRedisTemplate") + @ConditionalOnBean(ReactiveRedisConnectionFactory.class) + public ReactiveRedisTemplate reactiveRedisTemplate( + ReactiveRedisConnectionFactory reactiveRedisConnectionFactory, + ResourceLoader resourceLoader) { + + JdkSerializationRedisSerializer jdkSerializer = + new JdkSerializationRedisSerializer(resourceLoader.getClassLoader()); + + RedisSerializationContext serializationContext = + RedisSerializationContext.newSerializationContext() + .key(jdkSerializer) + .value(jdkSerializer) + .hashKey(jdkSerializer) + .hashValue(jdkSerializer).build(); + return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, + serializationContext); + } + +} diff --git a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories index 8b5e9eed202..e4686feb2ba 100644 --- a/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories @@ -49,6 +49,7 @@ org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\ org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\ +org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\ org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\ org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\ diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfigurationTests.java new file mode 100644 index 00000000000..48c20081f1d --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/redis/RedisReactiveAutoConfigurationTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.redis; + +import java.util.Map; + +import org.junit.After; +import org.junit.Test; + +import org.springframework.boot.test.util.EnvironmentTestUtils; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.data.redis.core.ReactiveRedisTemplate; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link RedisReactiveAutoConfiguration}. + * + * @author Stephane Nicoll + */ +public class RedisReactiveAutoConfigurationTests { + + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + this.context.close(); + } + } + + @Test + public void testDefaultRedisConfiguration() { + load(); + Map beans = this.context.getBeansOfType( + ReactiveRedisTemplate.class); + assertThat(beans).containsOnlyKeys("reactiveRedisTemplate"); + } + + + private void load(String... environment) { + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); + EnvironmentTestUtils.addEnvironment(ctx, environment); + ctx.register(RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class); + ctx.refresh(); + this.context = ctx; + } + +} diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index b602d279819..a7c317713ca 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -389,6 +389,11 @@ spring-boot-starter-data-redis 2.0.0.BUILD-SNAPSHOT + + org.springframework.boot + spring-boot-starter-data-redis-reactive + 2.0.0.BUILD-SNAPSHOT + org.springframework.boot spring-boot-starter-data-neo4j diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 863cda33e8d..8deea287b72 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -3264,9 +3264,12 @@ http://redis.io/[Redis] is a cache, message broker and richly-featured key-value Spring Boot offers basic auto-configuration for the https://github.com/xetorthio/jedis/[Jedis] and and https://github.com/mp911de/lettuce/[Lettuce] client library and abstractions on top of it provided by -https://github.com/spring-projects/spring-data-redis[Spring Data Redis]. There -is a `spring-boot-starter-data-redis` '`Starter`' for collecting the dependencies in a -convenient way that uses https://github.com/xetorthio/jedis/[Jedis] by default. +https://github.com/spring-projects/spring-data-redis[Spring Data Redis]. + +There is a `spring-boot-starter-data-redis` '`Starter`' for collecting the dependencies in +a convenient way that uses https://github.com/xetorthio/jedis/[Jedis] by default. If you +are building a reactive application, the `spring-boot-starter-data-redis-reactive` +'`Starter`' will get you going. diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml index 21aa81a558d..eaff2e49abf 100644 --- a/spring-boot-starters/pom.xml +++ b/spring-boot-starters/pom.xml @@ -38,6 +38,7 @@ spring-boot-starter-data-mongodb-reactive spring-boot-starter-data-neo4j spring-boot-starter-data-redis + spring-boot-starter-data-redis-reactive spring-boot-starter-data-rest spring-boot-starter-data-solr spring-boot-starter-freemarker diff --git a/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml b/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml new file mode 100644 index 00000000000..f7dfb0a04de --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml @@ -0,0 +1,71 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starters + 2.0.0.BUILD-SNAPSHOT + + spring-boot-starter-data-redis-reactive + Spring Boot Data Redis Reactive Starter + Starter for using Redis key-value data store with Spring Data Redis + reactive and the Lettuce client + http://projects.spring.io/spring-boot/ + + Pivotal Software, Inc. + http://www.spring.io + + + ${basedir}/../.. + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.data + spring-data-redis + + + org.slf4j + jcl-over-slf4j + + + + + io.lettuce + lettuce-core + + + org.apache.commons + commons-pool2 + + + io.projectreactor + reactor-core + + + + + + org.basepom.maven + duplicate-finder-maven-plugin + + + duplicate-dependencies + validate + + check + + + + changelog.txt + + + + + + + + diff --git a/spring-boot-starters/spring-boot-starter-data-redis-reactive/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-data-redis-reactive/src/main/resources/META-INF/spring.provides new file mode 100644 index 00000000000..7c4aeabfda9 --- /dev/null +++ b/spring-boot-starters/spring-boot-starter-data-redis-reactive/src/main/resources/META-INF/spring.provides @@ -0,0 +1 @@ +provides: spring-data-redis,lettuce-core \ No newline at end of file