1.修复三个Jedis客户端可能链接泄露的问题。

This commit is contained in:
wusheng 2016-01-04 16:57:35 +08:00
parent d051fa5935
commit 28754fb01d
3 changed files with 108 additions and 77 deletions

View File

@ -1,7 +1,9 @@
package com.ai.cloud.skywalking.alarm.model;
import com.ai.cloud.skywalking.alarm.util.RedisUtil;
import com.ai.cloud.skywalking.alarm.util.RedisUtil.Executable;
import com.google.gson.Gson;
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
@ -78,18 +80,16 @@ public class AlarmRule {
this.previousFireTimeM = previousFireTimeM;
}
private static long getPreviousFireTime(String userId, String ruleId) {
Jedis client = RedisUtil.getRedisClient();
try {
String previousTime = client.get(userId + "-" + ruleId);
if (previousTime == null || previousTime.length() <= 0) {
return System.currentTimeMillis() / (10000 * 6);
}
return Long.valueOf(previousTime);
} finally {
if (client != null) {
client.close();
}
}
private static long getPreviousFireTime(final String userId, final String ruleId) {
return RedisUtil.execute(new Executable<Long>() {
@Override
public Long exe(Jedis client) {
String previousTime = client.get(userId + "-" + ruleId);
if (previousTime == null || previousTime.length() <= 0) {
return System.currentTimeMillis() / (10000 * 6);
}
return Long.valueOf(previousTime);
}
});
}
}

View File

@ -1,24 +1,35 @@
package com.ai.cloud.skywalking.alarm.procesor;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import com.ai.cloud.skywalking.alarm.model.AlarmRule;
import com.ai.cloud.skywalking.alarm.model.ApplicationInfo;
import com.ai.cloud.skywalking.alarm.model.MailInfo;
import com.ai.cloud.skywalking.alarm.model.UserInfo;
import com.ai.cloud.skywalking.alarm.util.MailUtil;
import com.ai.cloud.skywalking.alarm.util.RedisUtil;
import com.ai.cloud.skywalking.alarm.util.RedisUtil.Executable;
import com.ai.cloud.skywalking.alarm.util.TemplateConfigurationUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
public class AlarmMessageProcessor {
@ -117,33 +128,36 @@ public class AlarmMessageProcessor {
return title;
}
private void expiredAlarmMessage(String key) {
Jedis client = RedisUtil.getRedisClient();
client.expire(key, 0);
if (client != null) {
client.close();
}
private void expiredAlarmMessage(final String key) {
RedisUtil.execute(new Executable<Long>() {
@Override
public Long exe(Jedis client) {
return client.expire(key, 0);
}
});
}
private void savePreviousFireTime(String userId, String ruleId,
long currentFireMinuteTime) {
Jedis client = RedisUtil.getRedisClient();
client.hset(userId, ruleId, String.valueOf(currentFireMinuteTime));
if (client != null) {
client.close();
}
private void savePreviousFireTime(final String userId, final String ruleId,
final long currentFireMinuteTime) {
RedisUtil.execute(new Executable<Long>() {
@Override
public Long exe(Jedis client) {
return client.hset(userId, ruleId, String.valueOf(currentFireMinuteTime));
}
});
}
private Collection<String> getAlarmMessages(String key) {
Jedis client = RedisUtil.getRedisClient();
Map<String, String> result = client.hgetAll(key);
if (result == null) {
return new ArrayList<String>();
}
client.close();
return result.keySet();
private Collection<String> getAlarmMessages(final String key) {
return RedisUtil.execute(new Executable<Collection<String>>() {
@Override
public Collection<String> exe(Jedis client) {
Map<String, String> result = client.hgetAll(key);
if (result == null) {
return new ArrayList<String>();
}
return result.keySet();
}
});
}
private String generateContent(String templateStr, Map parameter) throws IOException, TemplateException, SQLException {

View File

@ -1,46 +1,63 @@
package com.ai.cloud.skywalking.alarm.util;
import com.ai.cloud.skywalking.alarm.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;
import com.ai.cloud.skywalking.alarm.conf.Config;
public class RedisUtil {
private static Logger logger = LogManager.getLogger(RedisUtil.class);
private static JedisPool jedisPool;
private static String[] config;
private static Logger logger = LogManager.getLogger(RedisUtil.class);
private static JedisPool jedisPool;
private static String[] config;
static {
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String redisServerConfig = Config.Alarm.REDIS_SERVER;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server is not setting. Switch off alarm module. ");
} else {
config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server address is illegal setting, need to be 'ip:port'. Switch off alarm module. ");
Config.Alarm.ALARM_OFF_FLAG = true;
} else {
jedisPool = new JedisPool(genericObjectPoolConfig, config[0],
Integer.valueOf(config[1]));
}
}
}
static {
GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig();
String redisServerConfig = Config.Alarm.REDIS_SERVER;
if (redisServerConfig == null || redisServerConfig.length() <= 0) {
logger.error("Redis server is not setting. Switch off alarm module. ");
} else {
config = redisServerConfig.split(":");
if (config.length != 2) {
logger.error("Redis server address is illegal setting, need to be 'ip:port'. Switch off alarm module. ");
Config.Alarm.ALARM_OFF_FLAG = true;
} else {
jedisPool = new JedisPool(genericObjectPoolConfig, config[0],
Integer.valueOf(config[1]));
}
}
}
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;
}
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 static Jedis getRedisClient(){
return jedisPool.getResource();
}
private static Jedis getRedisClient() {
return jedisPool.getResource();
}
public static <R> R execute(Executable<R> exec) {
Jedis client = null;
try {
client = RedisUtil.getRedisClient();
return exec.exe(client);
} finally {
if (client != null) {
client.close();
}
}
}
public interface Executable<R> {
public R exe(Jedis client);
}
}