Browse Source
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-8053pull/9091/head
8 changed files with 216 additions and 3 deletions
@ -0,0 +1,68 @@
@@ -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<Object, Object> reactiveRedisTemplate( |
||||
ReactiveRedisConnectionFactory reactiveRedisConnectionFactory, |
||||
ResourceLoader resourceLoader) { |
||||
|
||||
JdkSerializationRedisSerializer jdkSerializer = |
||||
new JdkSerializationRedisSerializer(resourceLoader.getClassLoader()); |
||||
|
||||
RedisSerializationContext<Object, Object> serializationContext = |
||||
RedisSerializationContext.newSerializationContext() |
||||
.key(jdkSerializer) |
||||
.value(jdkSerializer) |
||||
.hashKey(jdkSerializer) |
||||
.hashValue(jdkSerializer).build(); |
||||
return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, |
||||
serializationContext); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,63 @@
@@ -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<String, ReactiveRedisTemplate> 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; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
<parent> |
||||
<groupId>org.springframework.boot</groupId> |
||||
<artifactId>spring-boot-starters</artifactId> |
||||
<version>2.0.0.BUILD-SNAPSHOT</version> |
||||
</parent> |
||||
<artifactId>spring-boot-starter-data-redis-reactive</artifactId> |
||||
<name>Spring Boot Data Redis Reactive Starter</name> |
||||
<description>Starter for using Redis key-value data store with Spring Data Redis |
||||
reactive and the Lettuce client</description> |
||||
<url>http://projects.spring.io/spring-boot/</url> |
||||
<organization> |
||||
<name>Pivotal Software, Inc.</name> |
||||
<url>http://www.spring.io</url> |
||||
</organization> |
||||
<properties> |
||||
<main.basedir>${basedir}/../..</main.basedir> |
||||
</properties> |
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>org.springframework.boot</groupId> |
||||
<artifactId>spring-boot-starter</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.springframework.data</groupId> |
||||
<artifactId>spring-data-redis</artifactId> |
||||
<exclusions> |
||||
<exclusion> |
||||
<groupId>org.slf4j</groupId> |
||||
<artifactId>jcl-over-slf4j</artifactId> |
||||
</exclusion> |
||||
</exclusions> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>io.lettuce</groupId> |
||||
<artifactId>lettuce-core</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.apache.commons</groupId> |
||||
<artifactId>commons-pool2</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>io.projectreactor</groupId> |
||||
<artifactId>reactor-core</artifactId> |
||||
</dependency> |
||||
</dependencies> |
||||
<build> |
||||
<plugins> |
||||
<plugin> |
||||
<groupId>org.basepom.maven</groupId> |
||||
<artifactId>duplicate-finder-maven-plugin</artifactId> |
||||
<executions> |
||||
<execution> |
||||
<id>duplicate-dependencies</id> |
||||
<phase>validate</phase> |
||||
<goals> |
||||
<goal>check</goal> |
||||
</goals> |
||||
<configuration> |
||||
<ignoredResourcePatterns> |
||||
<ignoredResourcePattern>changelog.txt</ignoredResourcePattern> |
||||
</ignoredResourcePatterns> |
||||
</configuration> |
||||
</execution> |
||||
</executions> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
</project> |
||||
Loading…
Reference in new issue