【エラー解決方法】Redis接続時にエラー発生!? を解決する方法(SSL接続編)

こんにちは、堀部です。
 
Spring Session + Redis(AWS ElastiCache)でセッション管理を行う方法 の過程で発生したエラーの解決方法です。
 
AWSでTomcatの起動まではできましたが、Redisへの接続に失敗しているようで5秒おきにエラーが出ていました。

エラー内容

ERROR RedisMessageListenerContainer - Connection failure occurred. Restarting subscription task after 5000 ms
ERROR TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketException: Connection reset; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
        at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:47) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:36) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:195) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisConnection.sMembers(JedisConnection.java:1879) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations$7.doInRedis(DefaultSetOperations.java:130) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations$7.doInRedis(DefaultSetOperations.java:127) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:85) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations.members(DefaultSetOperations.java:127) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultBoundSetOperations.members(DefaultBoundSetOperations.java:91) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.session.data.redis.RedisSessionExpirationPolicy.cleanExpiredSessions(RedisSessionExpirationPolicy.java:131) ~[spring-session-1.3.2.RELEASE.jar:na]
        at org.springframework.session.data.redis.RedisOperationsSessionRepository.cleanupExpiredSessions(RedisOperationsSessionRepository.java:398) ~[spring-session-1.3.2.RELEASE.jar:na]
        at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_171]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
        at redis.clients.jedis.Protocol.process(Protocol.java:131) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Protocol.read(Protocol.java:187) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:212) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.BinaryJedis.smembers(BinaryJedis.java:1239) ~[jedis-2.4.0.jar:na]
        at org.springframework.data.redis.connection.jedis.JedisConnection.sMembers(JedisConnection.java:1877) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        ... 22 common frames omitted
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:210) ~[na:1.8.0_171]
        at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_171]
        at java.net.SocketInputStream.read(SocketInputStream.java:127) ~[na:1.8.0_171]
        at redis.clients.util.RedisInputStream.fill(RedisInputStream.java:109) ~[jedis-2.4.0.jar:na]
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:45) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Protocol.process(Protocol.java:116) ~[jedis-2.4.0.jar:na]
        ... 26 common frames omitted
ERROR TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
org.springframework.data.redis.RedisConnectionFailureException: java.net.SocketException: Connection reset; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
        at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:47) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:36) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:195) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.connection.jedis.JedisConnection.sMembers(JedisConnection.java:1879) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations$7.doInRedis(DefaultSetOperations.java:130) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations$7.doInRedis(DefaultSetOperations.java:127) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:190) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:85) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultSetOperations.members(DefaultSetOperations.java:127) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.data.redis.core.DefaultBoundSetOperations.members(DefaultBoundSetOperations.java:91) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        at org.springframework.session.data.redis.RedisSessionExpirationPolicy.cleanExpiredSessions(RedisSessionExpirationPolicy.java:131) ~[spring-session-1.3.2.RELEASE.jar:na]
        at org.springframework.session.data.redis.RedisOperationsSessionRepository.cleanupExpiredSessions(RedisOperationsSessionRepository.java:398) ~[spring-session-1.3.2.RELEASE.jar:na]
        at sun.reflect.GeneratedMethodAccessor55.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65) ~[spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) [spring-context-4.1.1.RELEASE.jar:4.1.1.RELEASE]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_171]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset
        at redis.clients.jedis.Protocol.process(Protocol.java:131) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Protocol.read(Protocol.java:187) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:212) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.BinaryJedis.smembers(BinaryJedis.java:1239) ~[jedis-2.4.0.jar:na]
        at org.springframework.data.redis.connection.jedis.JedisConnection.sMembers(JedisConnection.java:1877) ~[spring-data-redis-1.4.2.RELEASE.jar:1.4.2.RELEASE]
        ... 22 common frames omitted
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:210) ~[na:1.8.0_171]
        at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_171]
        at java.net.SocketInputStream.read(SocketInputStream.java:127) ~[na:1.8.0_171]
        at redis.clients.util.RedisInputStream.fill(RedisInputStream.java:109) ~[jedis-2.4.0.jar:na]
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:45) ~[jedis-2.4.0.jar:na]
        at redis.clients.jedis.Protocol.process(Protocol.java:116) ~[jedis-2.4.0.jar:na]
        ... 26 common frames omitted

エラー発生時のバージョン

エラー発生時のバージョンは以下になります。
 

Java
1.8
Spring Framework
4.2.1
jedis
2.4.0
Redis
3.2.6

エラー解決方法

エラーとしては単純にRedisに接続できないという内容のエラーでしたが、原因はSSLでの接続が必要な環境で非SSLで接続しようとしていたためでした。
 
SSLで接続するためには、spring-data-redisのバージョンを1.8.0以上にする必要があります。1.8.0より前のバージョンではSSL接続に対応していません。
 
spring-data-redisのバージョンを上げると付随してほかのバージョンも上げないと正常に動きませんでしたので、spring-data-redis以外もバージョンを上げています。
 
spring-data-redisのバージョンを1.8.0以上にするとapplicationContext.xmlでuseSslのパラメータが使用できるようになりますが、こちらはデフォルトでSSL接続する(useSsl=true)になっていますので、何もしなくてOKです。
 
pom.xmlバージョン変更前

		<!-- spring session -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.4.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.4.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.3</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-data-redis</artifactId>
			<version>1.3.2.RELEASE</version>
		</dependency>

 
pom.xmlバージョン変更後
		<!-- spring session -->
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
			<version>1.8.13.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-pool2</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.session</groupId>
			<artifactId>spring-session-data-redis</artifactId>
			<version>1.3.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-commons</artifactId>
			<version>1.13.13.RELEASE</version>
		</dependency>

 
これで無事、接続ができました。
 
 
 
 
《関連記事》

記事をシェア
MOST VIEWED ARTICLES