调整目录结构,完成备份Redis的功能

This commit is contained in:
zhangxin10 2015-12-03 10:12:17 +08:00
parent 1231e06ce6
commit 7014fcd652
5 changed files with 121 additions and 72 deletions

View File

@ -1,69 +0,0 @@
package com.ai.cloud.skywalking.reciever.alarm.redis;
import com.ai.cloud.skywalking.reciever.conf.Config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisInitializer {
private static Logger logger = LogManager.getLogger(RedisInitializer.class);
private static JedisPool jedisPool;
private static final int REDIS_MAX_IDLE = 10;
private static final int REDIS_MIN_IDLE = 1;
private static final int REDIS_MAX_TOTAL = 20;
static {
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setMaxIdle(REDIS_MAX_IDLE);
genericObjectPoolConfig.setMinIdle(REDIS_MIN_IDLE);
genericObjectPoolConfig.setMaxTotal(REDIS_MAX_TOTAL);
String redisServerConfig = Config.Alarm.REDIS_SERVER_CONFIG;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server config is null.");
}
String[] config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server config is illegal");
}
jedisPool =
new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1]));
// Test connect redis.
RedisInitializer.redis(new Executor<String>() {
@Override
public String exec(Jedis jedis) {
return jedis.get("ok");
}
});
}
public static <T> T redis(Executor<T> executor) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return executor.exec(jedis);
} catch (Exception e) {
logger.error("Failed to connect redis", e);
//TODO 启动备用Redis
} finally {
if (jedis != null) {
jedis.close();
}
}
return null;
}
public interface Executor<R> {
R exec(Jedis jedis);
}
}

View File

@ -89,5 +89,13 @@ public class Config {
public static int ALARM_EXPIRE_SECONDS = 1000 * 60 * 90;
public static String REDIS_SERVER_CONFIG = "127.0.0.1:6379";
public static String BAK_REDIS_SERVER_CONFIG = "127.0.0.1:6379";
public static int REDIS_MAX_IDLE = 10;
public static int REDIS_MIN_IDLE = 1;
public static int REDIS_MAX_TOTAL = 20;
}
}

View File

@ -1,6 +1,6 @@
package com.ai.cloud.skywalking.reciever.alarm;
package com.ai.cloud.skywalking.reciever.storage.chain.alarm;
import com.ai.cloud.skywalking.reciever.alarm.redis.RedisInitializer;
import com.ai.cloud.skywalking.reciever.storage.chain.alarm.redis.RedisInitializer;
import redis.clients.jedis.Jedis;
import java.util.Collection;

View File

@ -0,0 +1,110 @@
package com.ai.cloud.skywalking.reciever.storage.chain.alarm.redis;
import com.ai.cloud.skywalking.reciever.conf.Config;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class RedisInitializer {
private static Logger logger = LogManager.getLogger(RedisInitializer.class);
private static JedisPool jedisPool;
private static Object lock = new Object();
static {
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String redisServerConfig = Config.Alarm.REDIS_SERVER_CONFIG;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server config is null.");
}
String[] config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server config is illegal");
}
jedisPool =
new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1]));
// Test connect redis.
RedisInitializer.redis(new Executor<String>() {
@Override
public String exec(Jedis jedis) {
return jedis.get("ok");
}
});
}
public static <T> T redis(Executor<T> executor) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.connect();
return executor.exec(jedis);
} catch (Exception e) {
jedisPool = null;
logger.error("Failed to connect redis", e);
// 启动备用Redis
if (jedisPool == null) {
synchronized (lock) {
if (jedisPool == null) {
// 生成备份Redis的Redis Client Pool
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String bakRedisServerConfig = Config.Alarm.BAK_REDIS_SERVER_CONFIG;
if (bakRedisServerConfig == null || bakRedisServerConfig.length() <= 0) {
logger.error("Bak Redis server config is null.");
}
String[] config = bakRedisServerConfig.split(":");
if (config.length != 2) {
logger.error("Bak Redis server config is illegal");
}
jedisPool =
new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1]));
try {
jedis = jedisPool.getResource();
jedis.connect();
jedis.get("ok");
} catch (Exception ex) {
logger.error("Failed to connect bak redis server.", ex);
// 备份Redis的都失败了没有想好怎么提示
//System.exit(-1);
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
// 重新再获取Redis Client返回执行
jedis = jedisPool.getResource();
jedis.connect();
return executor.exec(jedis);
}
} finally {
if (jedis != null) {
jedis.close();
}
}
return null;
}
private static GenericObjectPoolConfig buildGenericObjectPoolConfig() {
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setTestOnBorrow(true);
genericObjectPoolConfig.setMaxIdle(Config.Alarm.REDIS_MAX_IDLE);
genericObjectPoolConfig.setMinIdle(Config.Alarm.REDIS_MIN_IDLE);
genericObjectPoolConfig.setMaxTotal(Config.Alarm.REDIS_MAX_TOTAL);
return genericObjectPoolConfig;
}
public interface Executor<R> {
R exec(Jedis jedis);
}
}

View File

@ -1,4 +1,4 @@
package com.ai.cloud.skywalking.reciever.alarm;
package com.ai.cloud.skywalking.reciever.storage.chain.alarm;
import com.ai.cloud.skywalking.reciever.conf.Config;
import com.ai.cloud.skywalking.reciever.conf.ConfigInitializer;