1
1
package com .redis
2
2
3
- import org .apache .commons .pool ._
4
- import org .apache .commons .pool .impl ._
3
+ import java .util .concurrent .TimeUnit
4
+
5
+ import org .apache .commons .pool2 ._
6
+ import org .apache .commons .pool2 .impl ._
5
7
import com .redis .cluster .ClusterNode
6
8
7
9
private [redis] class RedisClientFactory (val host : String , val port : Int , val database : Int = 0 , val secret : Option [Any ] = None , val timeout : Int = 0 )
8
- extends PoolableObjectFactory [RedisClient ] {
10
+ extends PooledObjectFactory [RedisClient ] {
9
11
10
12
// when we make an object it's already connected
11
- def makeObject : RedisClient = {
12
- new RedisClient ( host, port, database, secret, timeout)
13
+ override def makeObject : PooledObject [ RedisClient ] = {
14
+ new DefaultPooledObject [ RedisClient ]( new RedisClient ( host, port, database, secret, timeout) )
13
15
}
14
16
15
17
// quit & disconnect
16
- def destroyObject (rc : RedisClient ): Unit = {
18
+ override def destroyObject (p : PooledObject [RedisClient ]): Unit = {
19
+ val rc = p.getObject
17
20
rc.quit // need to quit for closing the connection
18
21
rc.disconnect // need to disconnect for releasing sockets
19
22
}
20
23
21
24
// noop: we want to have it connected
22
- def passivateObject (rc : RedisClient ): Unit = {}
23
- def validateObject (rc : RedisClient ): Boolean = rc .connected
25
+ override def passivateObject (p : PooledObject [ RedisClient ] ): Unit = {}
26
+ override def validateObject (p : PooledObject [ RedisClient ] ): Boolean = p.getObject .connected
24
27
25
28
// noop: it should be connected already
26
- def activateObject (rc : RedisClient ): Unit = {}
29
+ override def activateObject (p : PooledObject [ RedisClient ] ): Unit = {}
27
30
}
28
31
29
32
object RedisClientPool {
30
- val UNLIMITED_CONNECTIONS = - 1
31
-
32
- val WHEN_EXHAUSTED_BLOCK = GenericObjectPool .WHEN_EXHAUSTED_BLOCK
33
- val WHEN_EXHAUSTED_FAIL = GenericObjectPool .WHEN_EXHAUSTED_FAIL
34
- val WHEN_EXHAUSTED_GROW = GenericObjectPool .WHEN_EXHAUSTED_GROW
33
+ val UNLIMITED_CONNECTIONS : Int = - 1
35
34
}
36
35
37
- class RedisClientPool (val host : String , val port : Int , val maxIdle : Int = 8 , val database : Int = 0 , val secret : Option [Any ] = None , val timeout : Int = 0 ,
38
- val maxConnections : Int = RedisClientPool .UNLIMITED_CONNECTIONS , val whenExhaustedBehavior : Byte = RedisClientPool .WHEN_EXHAUSTED_BLOCK , val poolWaitTimeout : Long = 3000 ) {
39
- val pool = new GenericObjectPool (new RedisClientFactory (host, port, database, secret, timeout), maxConnections, whenExhaustedBehavior, poolWaitTimeout, maxIdle, false , true )
36
+ class RedisClientPool (val host : String , val port : Int , val maxIdle : Int = 8 , val database : Int = 0 , val secret : Option [Any ] = None , val timeout : Int = 0 ,
37
+ val maxConnections : Int = RedisClientPool .UNLIMITED_CONNECTIONS , val poolWaitTimeout : Long = 3000 ) {
38
+
39
+ val objectPoolConfig = new GenericObjectPoolConfig [RedisClient ]
40
+ objectPoolConfig.setMaxIdle(maxIdle)
41
+ objectPoolConfig.setMaxTotal(maxConnections)
42
+ objectPoolConfig.setBlockWhenExhausted(true )
43
+ objectPoolConfig.setTestOnBorrow(false )
44
+ objectPoolConfig.setTestOnReturn(true )
45
+
46
+ val abandonedConfig = new AbandonedConfig
47
+ abandonedConfig.setRemoveAbandonedTimeout(TimeUnit .MILLISECONDS .toSeconds(poolWaitTimeout).toInt)
48
+ val pool = new GenericObjectPool (new RedisClientFactory (host, port, database, secret, timeout), objectPoolConfig,abandonedConfig)
40
49
override def toString : String = host + " :" + String .valueOf(port)
41
50
42
- def withClient [T ](body : RedisClient => T ) = {
51
+ def withClient [T ](body : RedisClient => T ): T = {
43
52
val client = pool.borrowObject
44
53
try {
45
54
body(client)
@@ -53,9 +62,9 @@ class RedisClientPool(val host: String, val port: Int, val maxIdle: Int = 8, val
53
62
}
54
63
55
64
/**
56
- *
57
- * @param node
58
- */
65
+ *
66
+ * @param node
67
+ */
59
68
class IdentifiableRedisClientPool (val node : ClusterNode )
60
69
extends RedisClientPool (node.host, node.port, node.maxIdle, node.database, node.secret,node.timeout){
61
70
override def toString : String = node.nodename
0 commit comments