增加注释

This commit is contained in:
machey
2018-12-30 17:04:15 +08:00
parent 100b43a5db
commit 661752096c
2 changed files with 91 additions and 43 deletions

View File

@@ -7,7 +7,7 @@ import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.otter.canal.deployer.monitor.ManagerDbConfigMonitor;
import com.alibaba.otter.canal.deployer.monitor.ManagerRemoteConfigMonitor;
/**
* canal独立版本启动的入口类
@@ -30,7 +30,7 @@ public class CanalLauncher {
logger.info("## load canal configurations");
String conf = System.getProperty("canal.conf", "classpath:canal.properties");
Properties properties = new Properties();
ManagerDbConfigMonitor managerDbConfigMonitor = null;
ManagerRemoteConfigMonitor managerDbConfigMonitor = null;
if (conf.startsWith(CLASSPATH_URL_PREFIX)) {
conf = StringUtils.substringAfter(conf, CLASSPATH_URL_PREFIX);
properties.load(CanalLauncher.class.getClassLoader().getResourceAsStream(conf));
@@ -44,7 +44,7 @@ public class CanalLauncher {
// load remote config
String jdbcUsername = properties.getProperty("canal.manager.jdbc.username");
String jdbcPassword = properties.getProperty("canal.manager.jdbc.password");
managerDbConfigMonitor = new ManagerDbConfigMonitor(jdbcUrl, jdbcUsername, jdbcPassword);
managerDbConfigMonitor = new ManagerRemoteConfigMonitor(jdbcUrl, jdbcUsername, jdbcPassword);
// 加载远程canal.properties
Properties remoteConfig = managerDbConfigMonitor.loadRemoteConfig();
// 加载remote instance配置
@@ -62,12 +62,12 @@ public class CanalLauncher {
canalStater.start(properties);
if (managerDbConfigMonitor != null) {
managerDbConfigMonitor.start(new ManagerDbConfigMonitor.Listener<Properties>() {
managerDbConfigMonitor.start(new ManagerRemoteConfigMonitor.Listener<Properties>() {
@Override
public void onChange(Properties properties) {
try {
// 远程配置canal.properties修改重新启动
// 远程配置canal.properties修改重新加载整个应用
canalStater.destroy();
canalStater.start(properties);
} catch (Throwable throwable) {

View File

@@ -18,11 +18,17 @@ import com.alibaba.otter.canal.deployer.CanalConstants;
import com.google.common.base.Joiner;
import com.google.common.collect.MapMaker;
public class ManagerDbConfigMonitor {
/**
* 远程配置装载监控
*
* @author rewerma 2018-12-30 下午05:12:16
* @version 1.0.1
*/
public class ManagerRemoteConfigMonitor {
private static final Logger logger = LoggerFactory.getLogger(ManagerDbConfigMonitor.class);
private static final Logger logger = LoggerFactory.getLogger(ManagerRemoteConfigMonitor.class);
private Map<String, ConfigItem> remoteInstanceConfigs = new MapMaker().makeMap();
private Map<String, ConfigItem> remoteInstanceConfigs = new MapMaker().makeMap();
private Connection conn;
private String jdbcUrl;
@@ -35,7 +41,7 @@ public class ManagerDbConfigMonitor {
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(2,
new NamedThreadFactory("remote-canal-config-scan"));
public ManagerDbConfigMonitor(String jdbcUrl, String jdbcUsername, String jdbcPassword){
public ManagerRemoteConfigMonitor(String jdbcUrl, String jdbcUsername, String jdbcPassword){
this.jdbcUrl = jdbcUrl;
this.jdbcUsername = jdbcUsername;
this.jdbcPassword = jdbcPassword;
@@ -53,6 +59,11 @@ public class ManagerDbConfigMonitor {
return conn;
}
/**
* 加载远程 canal.properties文件 覆盖本地
*
* @return 远程配置的properties
*/
public Properties loadRemoteConfig() {
Properties properties = null;
try {
@@ -74,6 +85,9 @@ public class ManagerDbConfigMonitor {
return properties;
}
/**
* 加载远程的instance配置 覆盖本地
*/
public void loadRemoteInstanceConfigs() {
try {
// 加载远程instance配置
@@ -86,6 +100,11 @@ public class ManagerDbConfigMonitor {
}
}
/**
* 获取远程canal.properties配置内容
*
* @return 内容对象
*/
private ConfigItem getRemoteCanalConfig() {
String sql = "select name, content, modified_time from canal_config where id=1";
try (Statement stmt = getConn().createStatement(); ResultSet rs = stmt.executeQuery(sql)) {
@@ -103,6 +122,11 @@ public class ManagerDbConfigMonitor {
return null;
}
/**
* 覆盖本地 canal.properties
*
* @param content 远程配置内容文本
*/
private void overrideLocalCanalConfig(String content) {
try (FileWriter writer = new FileWriter(getConfPath() + "canal.properties")) {
writer.write(content);
@@ -112,38 +136,11 @@ public class ManagerDbConfigMonitor {
}
}
public void start(final Listener<Properties> listener) {
// 监听canal.properties变化
executor.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
Properties properties = loadRemoteConfig();
if (properties != null) {
// 重启整个进程
listener.onChange(properties);
}
} catch (Throwable e) {
logger.error("scan failed", e);
}
}
}, 10, scanIntervalInSecond, TimeUnit.SECONDS);
// 监听instance变化
executor.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
loadRemoteInstanceConfigs();
} catch (Throwable e) {
logger.error("scan failed", e);
}
}
}, 10, 3, TimeUnit.SECONDS);
}
/**
* 获取远程instance新增、修改、删除配置
*
* @return Map[0]:新增或修改的instance配置; Map[1]:删除的instance配置
*/
@SuppressWarnings("unchecked")
private Map<String, ConfigItem>[] getModifiedInstanceConfigs() {
Map<String, ConfigItem>[] res = new Map[2];
@@ -216,12 +213,16 @@ public class ManagerDbConfigMonitor {
}
}
/**
* 覆盖本地instance配置
*
* @param modifiedInstanceConfigs 有变更的配置项
*/
private void overrideLocalInstanceConfigs(Map<String, ConfigItem>[] modifiedInstanceConfigs) {
Map<String, ConfigItem> changedInstanceConfigs = modifiedInstanceConfigs[0];
if (changedInstanceConfigs != null) {
for (ConfigItem configItem : changedInstanceConfigs.values()) {
try (FileWriter writer = new FileWriter(
getConfPath() + configItem.getName() + "/instance.properties")) {
try (FileWriter writer = new FileWriter(getConfPath() + configItem.getName() + "/instance.properties")) {
writer.write(configItem.getContent());
writer.flush();
} catch (Exception e) {
@@ -240,6 +241,45 @@ public class ManagerDbConfigMonitor {
}
}
/**
* 监听 canal 主配置和 instance 配置变化
*
* @param listener 监听回调方法
*/
public void start(final Listener<Properties> listener) {
// 监听canal.properties变化
executor.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
Properties properties = loadRemoteConfig();
if (properties != null) {
listener.onChange(properties);
}
} catch (Throwable e) {
logger.error("scan failed", e);
}
}
}, 10, scanIntervalInSecond, TimeUnit.SECONDS);
// 监听instance变化
executor.scheduleWithFixedDelay(new Runnable() {
public void run() {
try {
loadRemoteInstanceConfigs();
} catch (Throwable e) {
logger.error("scan failed", e);
}
}
}, 10, 3, TimeUnit.SECONDS);
}
/**
* 销毁
*/
public void destroy() {
executor.shutdownNow();
if (conn != null) {
@@ -251,6 +291,11 @@ public class ManagerDbConfigMonitor {
}
}
/**
* 获取conf文件夹所在路径
*
* @return 路径地址
*/
private String getConfPath() {
String classpath = this.getClass().getResource("/").getPath();
String confPath = classpath + ".." + File.separator + "conf" + File.separator;
@@ -261,6 +306,9 @@ public class ManagerDbConfigMonitor {
}
}
/**
* 配置对应对象
*/
public static class ConfigItem {
private Long id;