|
@@ -49,6 +49,8 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen
|
|
|
private ScheduledExecutorService executor = Executors.newScheduledThreadPool(1,
|
|
|
new NamedThreadFactory("canal-instance-scan"));
|
|
|
|
|
|
+ private volatile boolean isFirst = true;
|
|
|
+
|
|
|
public void start() {
|
|
|
super.start();
|
|
|
Assert.notNull(rootConf, "root conf dir is null!");
|
|
@@ -58,6 +60,7 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen
|
|
|
public void run() {
|
|
|
try {
|
|
|
scan();
|
|
|
+ if (isFirst) isFirst = false;
|
|
|
} catch (Throwable e) {
|
|
|
logger.error("scan failed", e);
|
|
|
}
|
|
@@ -122,13 +125,18 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen
|
|
|
|
|
|
if (!actions.containsKey(destination) && instanceConfigs.length > 0) {
|
|
|
// 存在合法的instance.properties,并且第一次添加时,进行启动操作
|
|
|
- notifyStart(instanceDir, destination);
|
|
|
+ notifyStart(instanceDir, destination, instanceConfigs);
|
|
|
} else if (actions.containsKey(destination)) {
|
|
|
// 历史已经启动过
|
|
|
if (instanceConfigs.length == 0) { // 如果不存在合法的instance.properties
|
|
|
notifyStop(destination);
|
|
|
} else {
|
|
|
InstanceConfigFiles lastFile = lastFiles.get(destination);
|
|
|
+ // 历史启动过 所以配置文件信息必然存在
|
|
|
+ if (!isFirst && CollectionUtils.isEmpty(lastFile.getInstanceFiles())) {
|
|
|
+ logger.error("[{}] is started, but not found instance file info.", destination);
|
|
|
+ }
|
|
|
+
|
|
|
boolean hasChanged = judgeFileChanged(instanceConfigs, lastFile.getInstanceFiles());
|
|
|
// 通知变化
|
|
|
if (hasChanged) {
|
|
@@ -161,10 +169,19 @@ public class SpringInstanceConfigMonitor extends AbstractCanalLifeCycle implemen
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void notifyStart(File instanceDir, String destination) {
|
|
|
+ private void notifyStart(File instanceDir, String destination, File[] instanceConfigs) {
|
|
|
try {
|
|
|
defaultAction.start(destination);
|
|
|
actions.put(destination, defaultAction);
|
|
|
+
|
|
|
+ // 启动成功后记录配置文件信息
|
|
|
+ InstanceConfigFiles lastFile = lastFiles.get(destination);
|
|
|
+ List<FileInfo> newFileInfo = new ArrayList<FileInfo>();
|
|
|
+ for (File instanceConfig : instanceConfigs) {
|
|
|
+ newFileInfo.add(new FileInfo(instanceConfig.getName(), instanceConfig.lastModified()));
|
|
|
+ }
|
|
|
+ lastFile.setInstanceFiles(newFileInfo);
|
|
|
+
|
|
|
logger.info("auto notify start {} successful.", destination);
|
|
|
} catch (Throwable e) {
|
|
|
logger.error("scan add found[{}] but start failed", destination, ExceptionUtils.getFullStackTrace(e));
|