package org.archive.wayback.accesscontrol.robotstxt.redis;
import java.io.PrintWriter;
import java.util.logging.Logger;
import org.apache.commons.pool.BasePoolableObjectFactory;
import org.apache.commons.pool.impl.GenericObjectPool;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.exceptions.JedisConnectionException;
public class RedisConnectionManager {
private final static Logger LOGGER = Logger
.getLogger(RedisConnectionManager.class.getName());
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public int getDb() {
return db;
}
public void setDb(int db) {
this.db = db;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
private String host = "localhost";
private int port = 6379;
private int db = 0;
private String password = null;
private int timeout = 2000;
private int connections = 50;
private JedisPoolConfig config = null;
public JedisPoolConfig getConfig() {
return config;
}
public void setConfig(JedisPoolConfig config) {
this.config = config;
}
public int getConnections() {
return connections;
}
public void setConnections(int connections) {
this.connections = connections;
}
//private JedisPool pool;
private GenericObjectPool goPool;
private class JedisValid extends Jedis
{
boolean valid = true;
public JedisValid(String host, int port, int timeout) {
super(host, port, timeout);
}
}
private class JedisFactory extends BasePoolableObjectFactory {
public Object makeObject() throws Exception {
final Jedis jedis;
jedis = new JedisValid(host, port, timeout);
if (password != null) {
jedis.getClient().setPassword(password);
}
jedis.connect();
return jedis;
}
public void destroyObject(final Object obj) throws Exception {
if (obj instanceof JedisValid) {
final JedisValid jedis = (JedisValid) obj;
if (jedis.isConnected()) {
try {
if (jedis.valid) {
try {
jedis.quit();
} catch (Exception e) {
}
}
jedis.disconnect();
} catch (Exception e) {
LOGGER.warning("REDISCONN: DISCONNECT: " + e);
}
}
}
}
public boolean validateObject(final Object obj) {
if (obj instanceof JedisValid) {
final JedisValid jedis = (JedisValid) obj;
try {
return jedis.isConnected();// && jedis.ping().equals("PONG");
} catch (final Exception e) {
jedis.valid = false;
LOGGER.warning("REDISCONN: VALIDATE: " + e);
return false;
}
} else {
return false;
}
}
}
public RedisConnectionManager()
{
}
public void init()
{
if (config == null) {
config = new JedisPoolConfig();
config.lifo = true;
config.timeBetweenEvictionRunsMillis = -1;
config.maxActive = connections;
config.maxIdle = connections;
config.testOnBorrow = true;
config.testOnReturn = false;
config.testWhileIdle = true;
config.whenExhaustedAction = GenericObjectPool.WHEN_EXHAUSTED_FAIL;
}
goPool = new GenericObjectPool(new JedisFactory(), config);
//pool = new JedisPool(config, host, port, timeout, password);
}
public Jedis getJedisInstance()
{
long startTime = System.currentTimeMillis();
//Jedis jedis = pool.getResource();
Jedis jedis;
try {
jedis = (Jedis)goPool.borrowObject();
} catch (Exception e) {
if (e instanceof JedisConnectionException) {
throw (JedisConnectionException)e;
}
throw new JedisConnectionException("Connection: ", e);
}
if (db != 0) {
jedis.select(db);
}
//PerformanceLogger.noteElapsed("JedisGetResource", System.currentTimeMillis() - startTime);
return jedis;
}
public void returnJedisInstance(Jedis jedis)
{
if (jedis == null) {
return;
}
//pool.returnResource(jedis);
try {
goPool.returnObject(jedis);
} catch (Exception e) {
LOGGER.warning("REDISCONN: RETURN: " + e);
}
}
public void returnBrokenJedis(Jedis jedis)
{
if (jedis == null) {
return;
}
((JedisValid)jedis).valid = false;
try {
goPool.invalidateObject(jedis);
} catch (Exception e) {
LOGGER.warning("REDISCONN: BROKEN: " + e);
}
//pool.returnBrokenResource(jedis);
}
public void close() {
if (goPool != null) {
try {
goPool.close();
} catch (Exception e) {
LOGGER.warning("REDISCONN: CLOSE: " + e);
}
}
}
public void appendLogInfo(PrintWriter info)
{
info.println(" Jedis Active: " + goPool.getNumActive());
info.println(" Jedis Idle: " + goPool.getNumIdle());
}
}