Skip to content
This repository has been archived by the owner on Feb 9, 2019. It is now read-only.

Add Redis Sentinel support through Provider for JedisSentinelPool #172

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Prev Previous commit
Next Next commit
Backport Redis Sentinel support to Play 2.4.2
kliewkliew committed Jun 26, 2016
commit 1191faa5202af6a63990086785c8c336b573fcfc
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.typesafe.play.redis

import PoolConfig.createPoolConfig

import java.net.URI
import javax.inject.{Provider, Inject, Singleton}

import org.apache.commons.lang3.builder.ReflectionToStringBuilder
import play.api.inject.ApplicationLifecycle
import play.api.{Logger, Configuration}
import redis.clients.jedis.{JedisPool, JedisPoolConfig}
import redis.clients.jedis.JedisPool

import scala.concurrent.Future

@@ -53,22 +55,4 @@ class JedisPoolProvider @Inject()(config: Configuration, lifecycle: ApplicationL

jedisPool
}

private def createPoolConfig(config: Configuration): JedisPoolConfig = {
val poolConfig: JedisPoolConfig = new JedisPoolConfig()
config.getInt("redis.pool.maxIdle").foreach(poolConfig.setMaxIdle)
config.getInt("redis.pool.minIdle").foreach(poolConfig.setMinIdle)
config.getInt("redis.pool.maxTotal").foreach(poolConfig.setMaxTotal)
config.getLong("redis.pool.maxWaitMillis").foreach(poolConfig.setMaxWaitMillis)
config.getBoolean("redis.pool.testOnBorrow").foreach(poolConfig.setTestOnBorrow)
config.getBoolean("redis.pool.testOnReturn").foreach(poolConfig.setTestOnReturn)
config.getBoolean("redis.pool.testWhileIdle").foreach(poolConfig.setTestWhileIdle)
config.getLong("redis.pool.timeBetweenEvictionRunsMillis").foreach(poolConfig.setTimeBetweenEvictionRunsMillis)
config.getInt("redis.pool.numTestsPerEvictionRun").foreach(poolConfig.setNumTestsPerEvictionRun)
config.getLong("redis.pool.minEvictableIdleTimeMillis").foreach(poolConfig.setMinEvictableIdleTimeMillis)
config.getLong("redis.pool.softMinEvictableIdleTimeMillis").foreach(poolConfig.setSoftMinEvictableIdleTimeMillis)
config.getBoolean("redis.pool.lifo").foreach(poolConfig.setLifo)
config.getBoolean("redis.pool.blockWhenExhausted").foreach(poolConfig.setBlockWhenExhausted)
poolConfig
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.typesafe.play.redis

import PoolConfig.createPoolConfig

import javax.inject.{Inject, Provider, Singleton}

import collection.JavaConverters._
import org.apache.commons.lang3.builder.ReflectionToStringBuilder
import play.api.{Configuration, Logger}
import play.api.inject.ApplicationLifecycle
import redis.clients.jedis.JedisSentinelPool


import scala.concurrent.Future

@Singleton
class JedisSentinelPoolProvider @Inject()(config: Configuration, lifecycle: ApplicationLifecycle) extends Provider[JedisSentinelPool] {

lazy val logger = Logger("redis.module")
lazy val get: JedisSentinelPool = {
val jedisSentinelPool = {
val masterName = config.getString("redis.master.name").getOrElse("mymaster")

val sentinelHosts = config.getStringList("redis.sentinel.hosts").getOrElse(Seq("localhost:26379").asJava)

val sentinelSet = new java.util.HashSet[String]()
sentinelSet.addAll(sentinelHosts)

val password = config.getString("redis.password").orNull

val timeout = config.getInt("redis.timeout").getOrElse(2000)

val poolConfig = createPoolConfig(config)
Logger.info(s"Redis Plugin enabled. Monitoring Redis master $masterName with Sentinels $sentinelSet and timeout $timeout.")
Logger.info("Redis Plugin pool configuration: " + new ReflectionToStringBuilder(poolConfig).toString)

new JedisSentinelPool(masterName, sentinelSet, poolConfig, timeout, password)
}

logger.info("Starting Jedis Sentinel Pool Provider")

lifecycle.addStopHook(() => Future.successful {
logger.info("Stopping Jedis Sentinel Pool Provider")
jedisSentinelPool.destroy()
})

jedisSentinelPool
}
}
24 changes: 24 additions & 0 deletions redis/src/main/scala/com/typesafe/play/redis/PoolConfig.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.typesafe.play.redis

import play.api.Configuration
import redis.clients.jedis.JedisPoolConfig

object PoolConfig {
def createPoolConfig(config: Configuration): JedisPoolConfig = {
val poolConfig: JedisPoolConfig = new JedisPoolConfig()
config.getInt("redis.pool.maxIdle").foreach(poolConfig.setMaxIdle)
config.getInt("redis.pool.minIdle").foreach(poolConfig.setMinIdle)
config.getInt("redis.pool.maxTotal").foreach(poolConfig.setMaxTotal)
config.getLong("redis.pool.maxWaitMillis").foreach(poolConfig.setMaxWaitMillis)
config.getBoolean("redis.pool.testOnBorrow").foreach(poolConfig.setTestOnBorrow)
config.getBoolean("redis.pool.testOnReturn").foreach(poolConfig.setTestOnReturn)
config.getBoolean("redis.pool.testWhileIdle").foreach(poolConfig.setTestWhileIdle)
config.getLong("redis.pool.timeBetweenEvictionRunsMillis").foreach(poolConfig.setTimeBetweenEvictionRunsMillis)
config.getInt("redis.pool.numTestsPerEvictionRun").foreach(poolConfig.setNumTestsPerEvictionRun)
config.getLong("redis.pool.minEvictableIdleTimeMillis").foreach(poolConfig.setMinEvictableIdleTimeMillis)
config.getLong("redis.pool.softMinEvictableIdleTimeMillis").foreach(poolConfig.setSoftMinEvictableIdleTimeMillis)
config.getBoolean("redis.pool.lifo").foreach(poolConfig.setLifo)
config.getBoolean("redis.pool.blockWhenExhausted").foreach(poolConfig.setBlockWhenExhausted)
poolConfig
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.typesafe.play.redis

import javax.inject.{Inject, Provider, Singleton}

import org.sedis.SentinelPool
import redis.clients.jedis.JedisSentinelPool

@Singleton
class SedisSentinelPoolProvider @Inject()(jedisSentinelPool: JedisSentinelPool) extends Provider[SentinelPool] {
lazy val get: SentinelPool = {
val sedisSentinelPool = {
new SentinelPool(jedisSentinelPool)
}
sedisSentinelPool
}
}