Remove Embedded Redis

Fixes gh-248
This commit is contained in:
Rob Winch
2015-07-24 15:40:55 -05:00
parent e4c74ebe91
commit 8eca5ea4c6
30 changed files with 79 additions and 331 deletions

View File

@@ -82,8 +82,9 @@ In this instance Spring Session is backed by Redis.
[[boot-redis-configuration]] [[boot-redis-configuration]]
== Configuring the Redis Connection == Configuring the Redis Connection
Spring Boot automatically creates a `RedisConnectionFactory` that connects Spring Session to the Redis Server. Spring Boot automatically creates a `RedisConnectionFactory` that connects Spring Session to a Redis Server on localhost on port 6379 (default port).
In a production environment you need to ensure to update your configuration to point to your Redis server. For example, you can include the following in your *application.properties* In a production environment you need to ensure to update your configuration to point to your Redis server.
For example, you can include the following in your *application.properties*
.src/main/resources/application.properties .src/main/resources/application.properties
---- ----
@@ -114,6 +115,12 @@ The boot Sample Application demonstrates how to use Spring Session to transparen
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:boot:bootRun $ ./gradlew :samples:boot:bootRun
---- ----

View File

@@ -79,14 +79,12 @@ Add the following Spring Configuration:
include::{samples-dir}httpsession-xml/src/main/webapp/WEB-INF/spring/session.xml[tags=beans] include::{samples-dir}httpsession-xml/src/main/webapp/WEB-INF/spring/session.xml[tags=beans]
---- ----
<1> We create an embedded Redis Server so that there is no need to start up Redis external of our application. <1> We use the combination of `<context:annotation-config/>` and `RedisHttpSessionConfiguration` because Spring Session does not yet provide XML Namespace support (see https://github.com/spring-projects/spring-session/issues/104[gh-104]).
In a production application this is not necessary since we would point our connection to an external Redis instance.
<2> We use the combination of `<context:annotation-config/>` and `RedisHttpSessionConfiguration` because Spring Session does not yet provide XML Namespace support (see https://github.com/spring-projects/spring-session/issues/104[gh-104]).
This creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter. This creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter.
The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session. The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session.
In this instance Spring Session is backed by Redis. In this instance Spring Session is backed by Redis.
<3> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server. <2> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server.
We use a http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#xsd-config-body-schemas-context-pphc[PropertyPlaceholderConfigurer] to externalize the port location. We configure the connection to connect to localhost on the default port (6379)
For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation]. For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation].
== XML Servlet Container Initialization == XML Servlet Container Initialization
@@ -128,6 +126,12 @@ For every request that `DelegatingFilterProxy` is invoked, the `springSessionRep
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:httpsession-xml:tomcatRun $ ./gradlew :samples:httpsession-xml:tomcatRun
---- ----

View File

@@ -78,13 +78,11 @@ Add the following Spring Configuration:
include::{samples-dir}httpsession/src/main/java/sample/Config.java[tags=class] include::{samples-dir}httpsession/src/main/java/sample/Config.java[tags=class]
---- ----
<1> We import an embedded Redis Server so that there is no need to start up Redis external of our application. <1> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter.
In a production application this is not necessary since we would point our connection to an external Redis instance.
<2> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter.
The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session. The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session.
In this instance Spring Session is backed by Redis. In this instance Spring Session is backed by Redis.
<3> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server. <2> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server.
We use a http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#xsd-config-body-schemas-context-pphc[PropertyPlaceholderConfigurer] to externalize the port location. We configure the connection to connect to localhost on the default port (6379)
For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation]. For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation].
== Java Servlet Container Initialization == Java Servlet Container Initialization
@@ -120,6 +118,12 @@ This ensures that the Spring Bean by the name `springSessionRepositoryFilter` is
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:httpsession:tomcatRun $ ./gradlew :samples:httpsession:tomcatRun
---- ----

View File

@@ -78,15 +78,13 @@ Add the following Spring Configuration:
include::{samples-dir}rest/src/main/java/sample/HttpSessionConfig.java[tags=class] include::{samples-dir}rest/src/main/java/sample/HttpSessionConfig.java[tags=class]
---- ----
<1> We import an embedded Redis Server so that there is no need to start up Redis external of our application. <1> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements `Filter`.
In a production application this is not necessary since we would point our connection to an external Redis instance.
<2> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements `Filter`.
The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session. The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session.
In this instance Spring Session is backed by Redis. In this instance Spring Session is backed by Redis.
<3> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server. <2> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server.
In our example, we are connecting to localhost on the default port (6379). We configure the connection to connect to localhost on the default port (6379)
For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation]. For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation].
<4> We customize Spring Session's HttpSession integration to use HTTP headers to convey the current session information instead of cookies. <3> We customize Spring Session's HttpSession integration to use HTTP headers to convey the current session information instead of cookies.
== Servlet Container Initialization == Servlet Container Initialization
@@ -121,6 +119,12 @@ NOTE: The name of our class (Initializer) does not matter. What is important is
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:rest:tomcatRun $ ./gradlew :samples:rest:tomcatRun
---- ----

View File

@@ -77,13 +77,11 @@ Add the following Spring Configuration:
include::{samples-dir}security/src/main/java/sample/Config.java[tags=class] include::{samples-dir}security/src/main/java/sample/Config.java[tags=class]
---- ----
<1> We import an embedded Redis Server so that there is no need to start up Redis external of our application. <1> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter.
In a production application this is not necessary since we would point our connection to an external Redis instance.
<2> The `@EnableRedisHttpSession` annotation creates a Spring Bean with the name of `springSessionRepositoryFilter` that implements Filter.
The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session. The filter is what is in charge of replacing the `HttpSession` implementation to be backed by Spring Session.
In this instance Spring Session is backed by Redis. In this instance Spring Session is backed by Redis.
<3> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server. <2> We create a `RedisConnectionFactory` that connects Spring Session to the Redis Server.
In our example, we are connecting to localhost on the default port (6379). We configure the connection to connect to localhost on the default port (6379)
For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation]. For more information on configuring Spring Data Redis, refer to the http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/[reference documentation].
== Servlet Container Initialization == Servlet Container Initialization
@@ -125,6 +123,12 @@ By extending `AbstractHttpSessionApplicationInitializer` we ensure that the Spri
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:security:tomcatRun $ ./gradlew :samples:security:tomcatRun
---- ----

View File

@@ -17,6 +17,12 @@ The users application demonstrates how to allow an application to manage multipl
You can run the sample by obtaining the {download-url}[source code] and invoking the following command: You can run the sample by obtaining the {download-url}[source code] and invoking the following command:
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:users:tomcatRun $ ./gradlew :samples:users:tomcatRun
---- ----

View File

@@ -82,6 +82,12 @@ include::{samples-dir}websocket/src/main/java/sample/config/WebSecurityConfig.ja
---- ----
==== ====
[NOTE]
====
For the sample to work, you must http://redis.io/download[install Redis 2.8+] on localhost and run it with the default port (6379).
Alternatively, you can update the `JedisConnectionFactory` to point to a Redis server.
====
---- ----
$ ./gradlew :samples:websocket:bootRun $ ./gradlew :samples:websocket:bootRun
---- ----

View File

@@ -17,7 +17,6 @@ group = 'samples'
dependencies { dependencies {
compile project(':spring-session'), compile project(':spring-session'),
project(':samples:spring-embedded-redis'),
"org.springframework.boot:spring-boot-starter-redis", "org.springframework.boot:spring-boot-starter-redis",
"org.springframework.boot:spring-boot-starter-web", "org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-starter-thymeleaf", "org.springframework.boot:spring-boot-starter-thymeleaf",

View File

@@ -15,11 +15,9 @@
*/ */
package sample.config; package sample.config;
import org.springframework.session.data.redis.config.annotation.web.http.*; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
@EnableEmbeddedRedis
// tag::class[] // tag::class[]
@EnableRedisHttpSession // <1> @EnableRedisHttpSession // <1>
public class HttpSessionConfig { } public class HttpSessionConfig { }

View File

@@ -8,7 +8,6 @@ sonarRunner {
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework:spring-web:$springVersion", "org.springframework:spring-web:$springVersion",
jstlDependencies jstlDependencies

View File

@@ -7,14 +7,12 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- tag::beans[] --> <!-- tag::beans[] -->
<bean class="org.springframework.session.redis.embedded.EmbeddedRedisConfiguration"/> <!--1-->
<!--2--> <!--1-->
<context:annotation-config/> <context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<!--3--> <!--2-->
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" <bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"/>
p:port="${spring.redis.port}"/>
<!-- end::beans[] --> <!-- end::beans[] -->
</beans> </beans>

View File

@@ -8,7 +8,6 @@ sonarRunner {
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework:spring-web:$springVersion", "org.springframework:spring-web:$springVersion",
jstlDependencies jstlDependencies

View File

@@ -18,19 +18,14 @@ package sample;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
// tag::class[] // tag::class[]
@EnableEmbeddedRedis // <1> @EnableRedisHttpSession // <1>
@EnableRedisHttpSession // <2>
public class Config { public class Config {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) { public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory(); // <3> return new JedisConnectionFactory(); // <2>
connection.setPort(port);
return connection;
} }
} }
// end::class[] // end::class[]

View File

@@ -8,7 +8,6 @@ sonarRunner {
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework:spring-webmvc:$springVersion", "org.springframework:spring-webmvc:$springVersion",
"org.springframework.security:spring-security-config:$springSecurityVersion", "org.springframework.security:spring-security-config:$springSecurityVersion",
"org.springframework.security:spring-security-web:$springSecurityVersion", "org.springframework.security:spring-security-web:$springSecurityVersion",

View File

@@ -19,27 +19,22 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
import org.springframework.session.web.http.HeaderHttpSessionStrategy; import org.springframework.session.web.http.HeaderHttpSessionStrategy;
import org.springframework.session.web.http.HttpSessionStrategy; import org.springframework.session.web.http.HttpSessionStrategy;
// tag::class[] // tag::class[]
@Configuration @Configuration
@EnableEmbeddedRedis // <1> @EnableRedisHttpSession // <1>
@EnableRedisHttpSession // <2>
public class HttpSessionConfig { public class HttpSessionConfig {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) { public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory(); // <3> return new JedisConnectionFactory(); // <2>
factory.setPort(port);
return factory;
} }
@Bean @Bean
public HttpSessionStrategy httpSessionStrategy() { public HttpSessionStrategy httpSessionStrategy() {
return new HeaderHttpSessionStrategy(); // <4> return new HeaderHttpSessionStrategy(); // <3>
} }
} }
// end::class[] // end::class[]

View File

@@ -8,7 +8,6 @@ sonarRunner {
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework:spring-web:$springVersion", "org.springframework:spring-web:$springVersion",
"org.springframework.security:spring-security-config:$springSecurityVersion", "org.springframework.security:spring-security-config:$springSecurityVersion",
"org.springframework.security:spring-security-web:$springSecurityVersion", "org.springframework.security:spring-security-web:$springSecurityVersion",

View File

@@ -19,20 +19,15 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
// tag::class[] // tag::class[]
@Configuration @Configuration
@EnableEmbeddedRedis // <1> @EnableRedisHttpSession // <1>
@EnableRedisHttpSession // <2>
public class Config { public class Config {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) { public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory(); // <3> return new JedisConnectionFactory(); // <2>
connection.setPort(port);
return connection;
} }
} }
// end::class[] // end::class[]

View File

@@ -1,14 +0,0 @@
apply from: JAVA_GRADLE
tasks.findByPath("artifactoryPublish")?.enabled = false
sonarRunner {
skipProject = true
}
dependencies {
compile "com.github.kstyrc:embedded-redis:$embeddedRedisVersion",
"org.springframework:spring-context:$springVersion"
testCompile "junit:junit:$junitVersion",
"org.springframework.security:spring-security-test:$springSecurityVersion"
}

View File

@@ -1,113 +0,0 @@
/*
* Copyright 2002-2015 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.session.redis.embedded;
import java.io.IOException;
import java.net.ServerSocket;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import redis.embedded.RedisServer;
/**
* Runs an embedded Redis instance. This is only necessary since we do not want
* users to have to setup a Redis instance. In a production environment, this
* would not be used since a Redis Server would be setup.
*
* @author Rob Winch
*/
@Configuration
class EmbeddedRedisConfiguration {
public static final String SERVER_PORT_PROP_NAME = "spring.redis.port";
@Bean
public static RedisServerBean redisServer(ConfigurableEnvironment env) {
RedisServerBean bean = new RedisServerBean();
env.getPropertySources().addLast(bean);
return bean;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
/**
* Implements BeanDefinitionRegistryPostProcessor to ensure this Bean is initialized
* before any other Beans. Specifically, we want to ensure that the Redis Server is
* started before RedisHttpSessionConfiguration attempts to enable Keyspace
* notifications. We also want to ensure that we are able to register the
* {@link PropertySource} before any beans are initialized.
*/
static class RedisServerBean extends PropertySource<RedisServerBean> implements InitializingBean, DisposableBean, BeanDefinitionRegistryPostProcessor {
private final int port = getAvailablePort();
private RedisServer redisServer;
public RedisServerBean() {
super("redisServerPortPropertySource");
}
public void afterPropertiesSet() throws Exception {
redisServer = new RedisServer(port);
redisServer.start();
}
public void destroy() throws Exception {
if(redisServer != null) {
redisServer.stop();
}
}
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {}
@Override
public Object getProperty(String name) {
if(SERVER_PORT_PROP_NAME.equals(name)) {
return port;
}
return null;
}
private static int getAvailablePort() {
ServerSocket socket = null;
try {
socket = new ServerSocket(0);
return socket.getLocalPort();
} catch(IOException e) {
throw new RuntimeException(e);
} finally {
try {
if(socket != null) {
socket.close();
}
}catch(IOException e) {}
}
}
}
}

View File

@@ -1,64 +0,0 @@
/*
* Copyright 2002-2015 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.session.redis.embedded;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* <p>
* Runs an embedded Redis instance on a random available port.This is only necessary
* sincewe do not want users to have to setup a Redis instance. In a production
* environment, this would not be used since a Redis Server would be setup.
* </p>
* <p>
* The port being used can be identified by using {@literal @RedisServerPort} on a Spring
* Bean. For example:
* </p>
*
* <pre>
* {@literal @Configuration}
* {@literal @EnableEmbeddedRedis}
* public class RedisHttpSessionConfig {
*
* {@literal @Bean}
* public JedisConnectionFactory connectionFactory({@literal @RedisServerPort} int port) throws Exception {
* JedisConnectionFactory connection = new JedisConnectionFactory();
* connection.setPort(port);
* return connection;
* }
*
* }
* </pre>
*
* See <a href="https://github.com/spring-projects/spring-session/issues/121"
* >spring-projects/spring-session/issues/121</a> for details on exposing embedded Redis
* support.
*
* @author Rob Winch
* @see RedisServerPort
*
*/
@Retention(value=java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value={java.lang.annotation.ElementType.TYPE})
@Documented
@Import(EmbeddedRedisConfiguration.class)
@Configuration
public @interface EnableEmbeddedRedis {}

View File

@@ -1,50 +0,0 @@
/*
* Copyright 2002-2015 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.session.redis.embedded;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Value;
/**
* A convenience for finding the Redis Server port when using {@link EnableEmbeddedRedis}. For example:
*
* <pre>
* {@literal @Configuration}
* {@literal @EnableEmbeddedRedis}
* public class RedisHttpSessionConfig {
*
* {@literal @Bean}
* public JedisConnectionFactory connectionFactory({@literal @RedisServerPort} int port) throws Exception {
* JedisConnectionFactory connection = new JedisConnectionFactory();
* connection.setPort(port);
* return connection;
* }
*
* }
* </pre>
*
* @author Rob Winch
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Value("${"+EmbeddedRedisConfiguration.SERVER_PORT_PROP_NAME+"}")
public @interface RedisServerPort { }

View File

@@ -8,7 +8,6 @@ sonarRunner {
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework:spring-web:$springVersion", "org.springframework:spring-web:$springVersion",
jstlDependencies jstlDependencies

View File

@@ -19,24 +19,19 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
/** /**
* @author Rob Winch * @author Rob Winch
*/ */
@EnableEmbeddedRedis
// tag::class[] // tag::class[]
@Configuration @Configuration
@EnableRedisHttpSession @EnableRedisHttpSession
public class Config { public class Config {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) { public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory(); return new JedisConnectionFactory();
connection.setPort(port);
return connection;
} }
} }
// end::class[] // end::class[]

View File

@@ -18,7 +18,6 @@ group = 'samples'
dependencies { dependencies {
compile project(':spring-session-data-redis'), compile project(':spring-session-data-redis'),
project(':samples:spring-embedded-redis'),
"org.springframework.boot:spring-boot-starter-web", "org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-starter-data-jpa", "org.springframework.boot:spring-boot-starter-data-jpa",
"org.springframework.boot:spring-boot-starter-thymeleaf", "org.springframework.boot:spring-boot-starter-thymeleaf",

View File

@@ -22,7 +22,6 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.session.redis.embedded.RedisServerPort;
@Configuration @Configuration
public class DataSourceConfig { public class DataSourceConfig {
@@ -34,9 +33,7 @@ public class DataSourceConfig {
} }
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) { public JedisConnectionFactory connectionFactory() {
JedisConnectionFactory connection = new JedisConnectionFactory(); // <3> return new JedisConnectionFactory();
connection.setPort(port);
return connection;
} }
} }

View File

@@ -27,12 +27,10 @@ import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.data.repository.query.SecurityEvaluationContextExtension; import org.springframework.security.data.repository.query.SecurityEvaluationContextExtension;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
@Configuration @Configuration
@EnableWebSecurity @EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) @EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableEmbeddedRedis
// tag::enable-redis-httpsession[] // tag::enable-redis-httpsession[]
@EnableRedisHttpSession//(maxInactiveIntervalInSeconds = 60) @EnableRedisHttpSession//(maxInactiveIntervalInSeconds = 60)
public class WebSecurityConfig public class WebSecurityConfig

View File

@@ -3,7 +3,6 @@ rootProject.name = 'spring-session-build'
include 'docs' include 'docs'
include 'samples:boot' include 'samples:boot'
include 'samples:spring-embedded-redis'
include 'samples:hazelcast' include 'samples:hazelcast'
include 'samples:httpsession' include 'samples:httpsession'
include 'samples:httpsession-xml' include 'samples:httpsession-xml'

View File

@@ -20,8 +20,7 @@ dependencies {
"org.springframework:spring-messaging:$springVersion", "org.springframework:spring-messaging:$springVersion",
"org.springframework:spring-websocket:$springVersion" "org.springframework:spring-websocket:$springVersion"
provided "javax.servlet:javax.servlet-api:$servletApiVersion" provided "javax.servlet:javax.servlet-api:$servletApiVersion"
integrationTestCompile project(':samples:spring-embedded-redis'), integrationTestCompile "redis.clients:jedis:2.4.1",
"redis.clients:jedis:2.4.1",
"org.apache.commons:commons-pool2:2.2" "org.apache.commons:commons-pool2:2.2"
testCompile "junit:junit:$junitVersion", testCompile "junit:junit:$junitVersion",

View File

@@ -34,8 +34,6 @@ import org.springframework.session.Session;
import org.springframework.session.SessionRepository; import org.springframework.session.SessionRepository;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.events.SessionDestroyedEvent; import org.springframework.session.events.SessionDestroyedEvent;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebAppConfiguration;
@@ -124,12 +122,10 @@ public class RedisOperationsSessionRepositoryITests<S extends Session> {
@Configuration @Configuration
@EnableRedisHttpSession @EnableRedisHttpSession
@EnableEmbeddedRedis
static class Config { static class Config {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) throws Exception { public JedisConnectionFactory connectionFactory() throws Exception {
JedisConnectionFactory factory = new JedisConnectionFactory(); JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setPort(port);
factory.setUsePool(false); factory.setUsePool(false);
return factory; return factory;
} }

View File

@@ -34,8 +34,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.session.ExpiringSession; import org.springframework.session.ExpiringSession;
import org.springframework.session.SessionRepository; import org.springframework.session.SessionRepository;
import org.springframework.session.events.SessionDestroyedEvent; import org.springframework.session.events.SessionDestroyedEvent;
import org.springframework.session.redis.embedded.EnableEmbeddedRedis;
import org.springframework.session.redis.embedded.RedisServerPort;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.context.web.WebAppConfiguration;
@@ -107,12 +105,10 @@ public class EnableRedisHttpSessionExpireSessionDestroyedTests<S extends Expirin
@Configuration @Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1) @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1)
@EnableEmbeddedRedis
static class Config { static class Config {
@Bean @Bean
public JedisConnectionFactory connectionFactory(@RedisServerPort int port) throws Exception { public JedisConnectionFactory connectionFactory() throws Exception {
JedisConnectionFactory factory = new JedisConnectionFactory(); JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setPort(port);
factory.setUsePool(false); factory.setUsePool(false);
return factory; return factory;
} }