/**
*
*/
package com.iflytek.edu.cloud.oauth2.support;
import io.netty.util.internal.SystemPropertyUtil;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.jdbc.core.JdbcTemplate;
import com.github.diamond.client.netty.NetUtils;
import com.github.diamond.client.util.NamedThreadFactory;
import com.iflytek.edu.cloud.oauth2.utils.EnvUtil;
import com.iflytek.edu.cloud.oauth2.utils.JettyConfigUtil;
/**
* Create on @2014年8月8日 @下午4:32:11
* @author libinsong1204@gmail.com
*/
public class JdbcRegistry implements InitializingBean {
private static final Logger LOGGER = LoggerFactory.getLogger(JdbcRegistry.class);
public static final int DEFAULT_SESSION_TIMEOUT = 60;
private final ScheduledExecutorService expireExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("CloudServiceRegistryExpireTimer", true));
private JdbcTemplate jdbcTemplate;
private int expirePeriod = DEFAULT_SESSION_TIMEOUT;
private final ScheduledFuture<?> expireFuture;
private final String appInstallDir;
private final String serverHost;
private final int serverPort;
private final String profile;
private final String projectName;
private final String buildVersion;
private final String buildTime;
private static final String INSERT_SQL = "INSERT INTO mon_app_registry(server_host,server_port,app_install_dir,"
+ "profile,projectName,buildVersion,buildTime,registry_time) VALUES (?,?,?,?,?,?,?,?)";
private static final String UPDATE_SQL = "UPDATE mon_app_registry SET app_install_dir = ?, PROFILE = ?, projectName = ?, "
+ "buildVersion = ?, buildTime = ?, registry_time = ? WHERE server_host = ? AND server_port = ?";
private static final String DELETE_SQL = "DELETE FROM mon_app_registry WHERE server_host = ? AND server_port = ?";
public JdbcRegistry() {
appInstallDir = SystemPropertyUtil.get("BASE_HOME");
serverHost = NetUtils.getLocalHost();
serverPort = JettyConfigUtil.getServerPort();
profile = StringUtils.join(EnvUtil.getSpringProfiles(), ",");
projectName = EnvUtil.getProjectName();
buildVersion = EnvUtil.getBuildVersion();
buildTime = EnvUtil.getBuildTime();
this.expireFuture = expireExecutor.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
deferExpired(); // 延长过期时间
} catch (Throwable t) { // 防御性容错
LOGGER.error("Unexpected exception occur at defer expire time, cause: " + t.getMessage(), t);
}
}
}, expirePeriod, expirePeriod, TimeUnit.SECONDS);
LOGGER.info("服务器注册:" + EnvUtil.getProjectName());
}
private void deferExpired() {
try {
jdbcTemplate.update(UPDATE_SQL, appInstallDir, profile, projectName, buildVersion,
buildTime, new Date(), serverHost, serverPort);
} catch (Throwable t) {
LOGGER.warn("Failed to write provider heartbeat to redis registry. cause: " + t.getMessage(), t);
}
}
public void afterPropertiesSet() throws java.lang.Exception {
boolean success = false;
RuntimeException exception = null;
try {
jdbcTemplate.update(DELETE_SQL, serverHost, serverPort);
jdbcTemplate.update(INSERT_SQL, serverHost, serverPort, appInstallDir,
profile, projectName, buildVersion, buildTime, new Date());
success = true;
} catch (Throwable t) {
exception = new RuntimeException("Failed to register service to redis registry. registry", t);
}
if (exception != null) {
if (success) {
LOGGER.warn(exception.getMessage(), exception);
} else {
throw exception;
}
}
}
public void destroy() {
try {
expireFuture.cancel(true);
} catch (Throwable t) {
LOGGER.warn(t.getMessage(), t);
}
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 单位:秒
* @param expirePeriod
*/
public void setExpirePeriod(int expirePeriod) {
this.expirePeriod = expirePeriod;
}
}