diff --git a/.gitignore b/.gitignore index e6d28c8..1aa973e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ project/plugins/target project/plugins/project/* .idea/* logs/ +*iml diff --git a/src/main/scala/sedis.scala b/src/main/scala/sedis.scala index b8df144..c1d717d 100644 --- a/src/main/scala/sedis.scala +++ b/src/main/scala/sedis.scala @@ -1,6 +1,8 @@ package org.sedis import redis.clients.jedis._ +import scala.util.{Failure, Try} +import redis.clients.jedis.exceptions.JedisConnectionException trait Dress { implicit def delegateToJedis(d: Wrap) = d.j @@ -90,22 +92,23 @@ object Dress extends Dress class Pool(val underlying: JedisPool) { def withClient[T](body: Dress.Wrap => T): T = { - val jedis: Jedis = underlying.getResource - try { - body(Dress.up(jedis)) - } finally { - underlying.returnResourceObject(jedis) - } + withJedisClient({ jedis: Jedis => body(Dress.up(jedis)) }) } + def withJedisClient[T](body: Jedis => T): T = { val jedis: Jedis = underlying.getResource - try { - body(jedis) - } finally { - underlying.returnResourceObject(jedis) + val result = Try(body(jedis)) + + result match { + case Failure(e:JedisConnectionException) => { + underlying.returnBrokenResource(jedis) + } + case _ => { + underlying.returnResource(jedis) + } } + result.get } - } class SentinelPool(val underlying: JedisSentinelPool) {