diff --git a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java index ba656b7f..0564b842 100644 --- a/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java +++ b/deployer/src/main/java/com/alibaba/otter/canal/deployer/monitor/SpringInstanceConfigMonitor.java @@ -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 newFileInfo = new ArrayList(); + 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));