AE86 1 gadu atpakaļ
vecāks
revīzija
d9737be7ab
59 mainītis faili ar 1387 papildinājumiem un 1482 dzēšanām
  1. 1 5
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/AbstractChecker.java
  2. 14 6
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/ConnectorChecker.java
  3. 9 5
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/OracleConfigChecker.java
  4. 3 4
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/group/ProjectGroupChecker.java
  5. 12 12
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/mapping/MappingChecker.java
  6. 4 4
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/system/SystemConfigChecker.java
  7. 15 11
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/tablegroup/TableGroupChecker.java
  8. 8 6
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/BaseServiceImpl.java
  9. 7 7
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConditionServiceImpl.java
  10. 48 16
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConnectorServiceImpl.java
  11. 5 5
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConvertServiceImpl.java
  12. 36 15
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/DataSyncServiceImpl.java
  13. 42 30
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MappingServiceImpl.java
  14. 51 10
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java
  15. 15 11
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/PluginServiceImpl.java
  16. 18 14
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ProjectGroupServiceImpl.java
  17. 11 11
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/SystemConfigServiceImpl.java
  18. 26 22
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/TableGroupServiceImpl.java
  19. 12 12
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/UserConfigServiceImpl.java
  20. 0 7
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/Command.java
  21. 0 6
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/CommandExecutor.java
  22. 0 37
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/Executor.java
  23. 0 149
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/Manager.java
  24. 10 300
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/ManagerFactory.java
  25. 0 14
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/Persistence.java
  26. 0 35
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/Preload.java
  27. 0 59
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/PreloadCommand.java
  28. 29 0
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/listener/ClosedTaskListener.java
  29. 9 9
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/FullPuller.java
  30. 11 149
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/IncrementPuller.java
  31. 70 70
      dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/PreloadTemplate.java
  32. 0 28
      dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/Monitor.java
  33. 12 99
      dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/MonitorFactory.java
  34. 5 92
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserComponent.java
  35. 187 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ProfileComponent.java
  36. 14 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Command.java
  37. 14 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/CommandExecutor.java
  38. 24 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Persistence.java
  39. 11 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/PersistenceCommand.java
  40. 51 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Preload.java
  41. 68 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/PreloadCommand.java
  42. 84 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/AbstractConsumer.java
  43. 87 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/impl/LogConsumer.java
  44. 42 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/impl/QuartzConsumer.java
  45. 7 4
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/enums/CommandEnum.java
  46. 8 5
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/enums/GroupStrategyEnum.java
  47. 14 5
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/BufferActuatorRouter.java
  48. 6 6
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java
  49. 8 116
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ParserComponentImpl.java
  50. 208 0
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ProfileComponentImpl.java
  51. 9 50
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/message/MessageServiceImpl.java
  52. 9 4
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/FieldPicker.java
  53. 6 4
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/OperationConfig.java
  54. 5 3
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/QueryConfig.java
  55. 4 1
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/GroupStrategy.java
  56. 5 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/DefaultGroupStrategy.java
  57. 5 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/PreloadTableGroupStrategy.java
  58. 5 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/TableGroupStrategy.java
  59. 23 16
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/template/OperationTemplate.java

+ 1 - 5
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/AbstractChecker.java

@@ -6,7 +6,6 @@ import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.model.Filter;
-import org.dbsyncer.manager.Manager;
 import org.dbsyncer.parser.model.AbstractConfigModel;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Convert;
@@ -35,9 +34,6 @@ public abstract class AbstractChecker implements Checker {
 
     private static final String SYMBOL = "***";
 
-    @Resource
-    private Manager manager;
-
     @Resource
     private PluginFactory pluginFactory;
 
@@ -95,7 +91,7 @@ public abstract class AbstractChecker implements Checker {
         String pluginId = params.get("pluginId");
         Plugin plugin = null;
         if (StringUtil.isNotBlank(pluginId)) {
-            List<Plugin> plugins = manager.getPluginAll();
+            List<Plugin> plugins = pluginFactory.getPluginAll();
             if (!CollectionUtils.isEmpty(plugins)) {
                 for (Plugin p : plugins) {
                     if (StringUtil.equals(pluginFactory.createPluginId(p.getClassName(), p.getVersion()), pluginId)) {

+ 14 - 6
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/ConnectorChecker.java

@@ -6,9 +6,11 @@ import org.dbsyncer.biz.checker.ConnectorConfigChecker;
 import org.dbsyncer.common.model.AbstractConnectorConfig;
 import org.dbsyncer.common.spi.ConnectorMapper;
 import org.dbsyncer.common.util.StringUtil;
+import org.dbsyncer.connector.ConnectorFactory;
 import org.dbsyncer.connector.enums.ConnectorEnum;
 import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
@@ -34,11 +36,17 @@ public class ConnectorChecker extends AbstractChecker {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Manager manager;
+    private ParserComponent parserComponent;
+
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Resource
     private LogService logService;
 
+    @Resource
+    private ConnectorFactory connectorFactory;
+
     @Resource
     private Map<String, ConnectorConfigChecker> map;
 
@@ -75,7 +83,7 @@ public class ConnectorChecker extends AbstractChecker {
         printParams(params);
         Assert.notEmpty(params, "ConnectorChecker check params is null.");
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
-        Connector connector = manager.getConnector(id);
+        Connector connector = profileComponent.getConnector(id);
         Assert.notNull(connector, "Can not find connector.");
 
         // 修改基本配置
@@ -106,14 +114,14 @@ public class ConnectorChecker extends AbstractChecker {
     }
 
     private void setTable(Connector connector) {
-        boolean isAlive = manager.refreshConnectorConfig(connector.getConfig());
+        boolean isAlive = connectorFactory.isAlive(connector.getConfig());
         if (!isAlive) {
             logService.log(LogType.ConnectorLog.FAILED);
         }
         Assert.isTrue(isAlive, "无法连接.");
         // 获取表信息
-        ConnectorMapper connectorMapper = manager.connect(connector.getConfig());
-        List<Table> table = manager.getTable(connectorMapper);
+        ConnectorMapper connectorMapper = connectorFactory.connect(connector.getConfig());
+        List<Table> table = parserComponent.getTable(connectorMapper);
         connector.setTable(table);
     }
 

+ 9 - 5
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/connector/OracleConfigChecker.java

@@ -7,14 +7,15 @@ import org.dbsyncer.connector.config.DatabaseConfig;
 import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.model.FieldMapping;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.TableGroup;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -32,8 +33,11 @@ import java.util.Map;
 @Component
 public class OracleConfigChecker extends AbstractDataBaseConfigChecker {
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ParserComponent parserComponent;
+
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Override
     public void modify(DatabaseConfig connectorConfig, Map<String, String> params) {
@@ -139,7 +143,7 @@ public class OracleConfigChecker extends AbstractDataBaseConfigChecker {
         // 没有自定义主键,获取表元信息
         if (null == pk) {
             Table targetTable = tableGroup.getTargetTable();
-            MetaInfo metaInfo = manager.getMetaInfo(mapping.getTargetConnectorId(), targetTable.getName());
+            MetaInfo metaInfo = parserComponent.getMetaInfo(mapping.getTargetConnectorId(), targetTable.getName());
             List<Field> targetColumn = metaInfo.getColumn();
             targetTable.setColumn(targetColumn);
 

+ 3 - 4
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/group/ProjectGroupChecker.java

@@ -3,11 +3,10 @@ package org.dbsyncer.biz.checker.impl.group;
 import org.dbsyncer.biz.checker.AbstractChecker;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.ProjectGroup;
 import org.dbsyncer.storage.constant.ConfigConstant;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
@@ -25,7 +24,7 @@ import java.util.Map;
 public class ProjectGroupChecker extends AbstractChecker {
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     /**
      * 新增配置
@@ -56,7 +55,7 @@ public class ProjectGroupChecker extends AbstractChecker {
     @Override
     public ConfigModel checkEditConfigModel(Map<String, String> params) {
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
-        ProjectGroup projectGroup = manager.getProjectGroup(id);
+        ProjectGroup projectGroup = profileComponent.getProjectGroup(id);
         Assert.notNull(projectGroup, "Can not find project group.");
 
         modifyProjectGroup(projectGroup, params);

+ 12 - 12
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/mapping/MappingChecker.java

@@ -10,7 +10,7 @@ import org.dbsyncer.common.util.NumberUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.listener.config.ListenerConfig;
 import org.dbsyncer.listener.enums.ListenerTypeEnum;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Mapping;
@@ -41,7 +41,7 @@ public class MappingChecker extends AbstractChecker {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
     private TableGroupChecker tableGroupChecker;
@@ -81,7 +81,7 @@ public class MappingChecker extends AbstractChecker {
         logger.info("params:{}", params);
         Assert.notEmpty(params, "MappingChecker check params is null.");
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
-        Mapping mapping = manager.getMapping(id);
+        Mapping mapping = profileComponent.getMapping(id);
         Assert.notNull(mapping, "Can not find mapping.");
 
         // 修改基本配置
@@ -124,7 +124,7 @@ public class MappingChecker extends AbstractChecker {
         // 修改基本配置
         this.modifyConfigModel(meta, new HashMap<>());
 
-        String id = manager.addConfigModel(meta);
+        String id = profileComponent.addConfigModel(meta);
         mapping.setMetaId(id);
     }
 
@@ -144,7 +144,7 @@ public class MappingChecker extends AbstractChecker {
      * @param params
      */
     public void batchMergeTableGroupConfig(Mapping mapping, Map<String, String> params) {
-        List<TableGroup> groupAll = manager.getTableGroupAll(mapping.getId());
+        List<TableGroup> groupAll = profileComponent.getTableGroupAll(mapping.getId());
         if (!CollectionUtils.isEmpty(groupAll)) {
             // 手动排序
             String[] sortedTableGroupIds = StringUtil.split(params.get("sortedTableGroupIds"), "|");
@@ -153,7 +153,7 @@ public class MappingChecker extends AbstractChecker {
                 groupAll.clear();
                 int size = sortedTableGroupIds.length;
                 int i = size;
-                while (i > 0){
+                while (i > 0) {
                     TableGroup g = tableGroupMap.get(sortedTableGroupIds[size - i]);
                     Assert.notNull(g, "Invalid sorted tableGroup.");
                     g.setIndex(i);
@@ -165,7 +165,7 @@ public class MappingChecker extends AbstractChecker {
             // 合并配置
             for (TableGroup g : groupAll) {
                 tableGroupChecker.mergeConfig(mapping, g);
-                manager.editConfigModel(g);
+                profileComponent.editConfigModel(g);
             }
         }
     }
@@ -194,16 +194,16 @@ public class MappingChecker extends AbstractChecker {
      * @param metaSnapshot
      */
     private void updateMeta(Mapping mapping, String metaSnapshot) {
-        Meta meta = manager.getMeta(mapping.getMetaId());
+        Meta meta = profileComponent.getMeta(mapping.getMetaId());
         Assert.notNull(meta, "驱动meta不存在.");
 
         // 清空状态
         meta.clear();
 
         // 手动配置增量点
-        if(StringUtil.isNotBlank(metaSnapshot)){
+        if (StringUtil.isNotBlank(metaSnapshot)) {
             Map snapshot = JsonUtil.jsonToObj(metaSnapshot, HashMap.class);
-            if(!CollectionUtils.isEmpty(snapshot)){
+            if (!CollectionUtils.isEmpty(snapshot)) {
                 meta.setSnapshot(snapshot);
             }
         }
@@ -211,7 +211,7 @@ public class MappingChecker extends AbstractChecker {
         getMetaTotal(meta, mapping.getModel());
 
         meta.setUpdateTime(Instant.now().toEpochMilli());
-        manager.editConfigModel(meta);
+        profileComponent.editConfigModel(meta);
     }
 
     private void getMetaTotal(Meta meta, String model) {
@@ -219,7 +219,7 @@ public class MappingChecker extends AbstractChecker {
         if (ModelEnum.isFull(model)) {
             // 统计tableGroup总条数
             AtomicLong count = new AtomicLong(0);
-            List<TableGroup> groupAll = manager.getTableGroupAll(meta.getMappingId());
+            List<TableGroup> groupAll = profileComponent.getTableGroupAll(meta.getMappingId());
             if (!CollectionUtils.isEmpty(groupAll)) {
                 for (TableGroup g : groupAll) {
                     count.getAndAdd(g.getSourceTable().getCount());

+ 4 - 4
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/system/SystemConfigChecker.java

@@ -3,7 +3,7 @@ package org.dbsyncer.biz.checker.impl.system;
 import org.dbsyncer.biz.checker.AbstractChecker;
 import org.dbsyncer.common.util.BeanUtil;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
@@ -27,7 +27,7 @@ public class SystemConfigChecker extends AbstractChecker {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
     private LogService logService;
@@ -40,7 +40,7 @@ public class SystemConfigChecker extends AbstractChecker {
         // 修改基本配置
         this.modifyConfigModel(systemConfig, params);
 
-        manager.addConfigModel(systemConfig);
+        profileComponent.addConfigModel(systemConfig);
         return systemConfig;
     }
 
@@ -50,7 +50,7 @@ public class SystemConfigChecker extends AbstractChecker {
         Assert.notEmpty(params, "Config check params is null.");
         params.put("enableCDN", StringUtil.isNotBlank(params.get("enableCDN")) ? "true" : "false");
 
-        SystemConfig systemConfig = manager.getSystemConfig();
+        SystemConfig systemConfig = profileComponent.getSystemConfig();
         Assert.notNull(systemConfig, "配置文件为空.");
         BeanUtil.mapToBean(params, systemConfig);
         logService.log(LogType.SystemLog.INFO, "修改系统配置");

+ 15 - 11
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/tablegroup/TableGroupChecker.java

@@ -10,7 +10,8 @@ import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.connector.model.Table;
 import org.dbsyncer.connector.util.PrimaryKeyUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.FieldMapping;
@@ -45,7 +46,10 @@ public class TableGroupChecker extends AbstractChecker {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Manager manager;
+    private ParserComponent parserComponent;
+
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Resource
     private Map<String, ConnectorConfigChecker> map;
@@ -61,7 +65,7 @@ public class TableGroupChecker extends AbstractChecker {
         Assert.hasText(mappingId, "tableGroup mappingId is empty.");
         Assert.hasText(sourceTable, "tableGroup sourceTable is empty.");
         Assert.hasText(targetTable, "tableGroup targetTable is empty.");
-        Mapping mapping = manager.getMapping(mappingId);
+        Mapping mapping = profileComponent.getMapping(mappingId);
         Assert.notNull(mapping, "mapping can not be null.");
 
         // 检查是否存在重复映射关系
@@ -92,9 +96,9 @@ public class TableGroupChecker extends AbstractChecker {
         logger.info("params:{}", params);
         Assert.notEmpty(params, "TableGroupChecker check params is null.");
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
-        TableGroup tableGroup = manager.getTableGroup(id);
+        TableGroup tableGroup = profileComponent.getTableGroup(id);
         Assert.notNull(tableGroup, "Can not find tableGroup.");
-        Mapping mapping = manager.getMapping(tableGroup.getMappingId());
+        Mapping mapping = profileComponent.getMapping(tableGroup.getMappingId());
         Assert.notNull(mapping, "mapping can not be null.");
         String fieldMappingJson = params.get("fieldMapping");
         Assert.hasText(fieldMappingJson, "TableGroupChecker check params fieldMapping is empty");
@@ -120,7 +124,7 @@ public class TableGroupChecker extends AbstractChecker {
      * @param tableGroup
      */
     public void refreshTableFields(TableGroup tableGroup) {
-        Mapping mapping = manager.getMapping(tableGroup.getMappingId());
+        Mapping mapping = profileComponent.getMapping(tableGroup.getMappingId());
         Assert.notNull(mapping, "mapping can not be null.");
 
         Table sourceTable = tableGroup.getSourceTable();
@@ -138,16 +142,16 @@ public class TableGroupChecker extends AbstractChecker {
         // 处理策略
         dealIncrementStrategy(mapping, group);
 
-        Map<String, String> command = manager.getCommand(mapping, group);
+        Map<String, String> command = parserComponent.getCommand(mapping, group);
         tableGroup.setCommand(command);
 
         // 获取数据源总数
-        long count = ModelEnum.isFull(mapping.getModel()) && !CollectionUtils.isEmpty(command) ? manager.getCount(mapping.getSourceConnectorId(), command) : 0;
+        long count = ModelEnum.isFull(mapping.getModel()) && !CollectionUtils.isEmpty(command) ? parserComponent.getCount(mapping.getSourceConnectorId(), command) : 0;
         tableGroup.getSourceTable().setCount(count);
     }
 
     public void dealIncrementStrategy(Mapping mapping, TableGroup tableGroup) {
-        String connectorType = manager.getConnector(mapping.getSourceConnectorId()).getConfig().getConnectorType();
+        String connectorType = profileComponent.getConnector(mapping.getSourceConnectorId()).getConfig().getConnectorType();
         String type = StringUtil.toLowerCaseFirstOne(connectorType).concat("ConfigChecker");
         ConnectorConfigChecker checker = map.get(type);
         Assert.notNull(checker, "Checker can not be null.");
@@ -155,7 +159,7 @@ public class TableGroupChecker extends AbstractChecker {
     }
 
     private Table getTable(String connectorId, String tableName, String primaryKeyStr) {
-        MetaInfo metaInfo = manager.getMetaInfo(connectorId, tableName);
+        MetaInfo metaInfo = parserComponent.getMetaInfo(connectorId, tableName);
         Assert.notNull(metaInfo, "无法获取连接器表信息:" + tableName);
         // 自定义主键
         if (StringUtil.isNotBlank(primaryKeyStr) && !CollectionUtils.isEmpty(metaInfo.getColumn())) {
@@ -173,7 +177,7 @@ public class TableGroupChecker extends AbstractChecker {
     }
 
     private void checkRepeatedTable(String mappingId, String sourceTable, String targetTable) {
-        List<TableGroup> list = manager.getTableGroupAll(mappingId);
+        List<TableGroup> list = profileComponent.getTableGroupAll(mappingId);
         if (!CollectionUtils.isEmpty(list)) {
             for (TableGroup g : list) {
                 // 数据源表和目标表都存在

+ 8 - 6
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/BaseServiceImpl.java

@@ -1,6 +1,6 @@
 package org.dbsyncer.biz.impl;
 
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.MetaEnum;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.logger.LogService;
@@ -13,12 +13,14 @@ import org.dbsyncer.parser.model.TableGroup;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
+
 public class BaseServiceImpl {
 
-    @Autowired
-    protected Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
-    @Autowired
+    @Resource
     private LogService logService;
 
     @Autowired
@@ -30,7 +32,7 @@ public class BaseServiceImpl {
     protected final static Object LOCK = new Object();
 
     protected boolean isRunning(String metaId) {
-        Meta meta = manager.getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         if (null != meta) {
             int state = meta.getState();
             return MetaEnum.isRunning(state);
@@ -66,7 +68,7 @@ public class BaseServiceImpl {
 
     protected void log(LogType log, TableGroup tableGroup) {
         if (null != tableGroup) {
-            Mapping mapping = manager.getMapping(tableGroup.getMappingId());
+            Mapping mapping = profileComponent.getMapping(tableGroup.getMappingId());
             if (null != mapping) {
                 // 新增驱动知识库(全量)映射关系:[My_User] >> [My_User_Target]
                 String name = mapping.getName();

+ 7 - 7
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConditionServiceImpl.java

@@ -5,10 +5,10 @@ import org.dbsyncer.biz.vo.ConditionVo;
 import org.dbsyncer.connector.enums.FilterEnum;
 import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.listener.enums.QuartzFilterEnum;
-import org.dbsyncer.manager.Manager;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.dbsyncer.parser.ProfileComponent;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -19,14 +19,14 @@ import java.util.List;
 @Component
 public class ConditionServiceImpl implements ConditionService {
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Override
     public ConditionVo getCondition() {
-        List<OperationEnum> operationEnumAll = manager.getOperationEnumAll();
-        List<QuartzFilterEnum> quartzFilterEnumAll = manager.getQuartzFilterEnumAll();
-        List<FilterEnum> filterEnumAll = manager.getFilterEnumAll();
+        List<OperationEnum> operationEnumAll = profileComponent.getOperationEnumAll();
+        List<QuartzFilterEnum> quartzFilterEnumAll = profileComponent.getQuartzFilterEnumAll();
+        List<FilterEnum> filterEnumAll = profileComponent.getFilterEnumAll();
         return new ConditionVo(operationEnumAll, quartzFilterEnumAll, filterEnumAll);
     }
 }

+ 48 - 16
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConnectorServiceImpl.java

@@ -3,10 +3,13 @@ package org.dbsyncer.biz.impl;
 import org.dbsyncer.biz.BizException;
 import org.dbsyncer.biz.ConnectorService;
 import org.dbsyncer.biz.checker.Checker;
+import org.dbsyncer.common.model.AbstractConnectorConfig;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.connector.ConnectorFactory;
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Connector;
@@ -14,10 +17,10 @@ import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashSet;
@@ -39,10 +42,16 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
 
     private Map<String, Boolean> health = new LinkedHashMap<>();
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
-    @Autowired
+    @Resource
+    private ConnectorFactory connectorFactory;
+
+    @Resource
+    private LogService logService;
+
+    @Resource
     private Checker connectorChecker;
 
     @Override
@@ -50,7 +59,7 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
         ConfigModel model = connectorChecker.checkAddConfigModel(params);
         log(LogType.ConnectorLog.INSERT, model);
 
-        return manager.addConfigModel(model);
+        return profileComponent.addConfigModel(model);
     }
 
     @Override
@@ -62,7 +71,7 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
         params.put(ConfigConstant.CONFIG_MODEL_NAME, connector.getName() + "(复制)");
         ConfigModel model = connectorChecker.checkAddConfigModel(params);
         log(LogType.ConnectorLog.COPY, model);
-        manager.addConfigModel(model);
+        profileComponent.addConfigModel(model);
 
         return String.format("复制成功[%s]", model.getName());
     }
@@ -72,12 +81,12 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
         ConfigModel model = connectorChecker.checkEditConfigModel(params);
         log(LogType.ConnectorLog.UPDATE, model);
 
-        return manager.editConfigModel(model);
+        return profileComponent.editConfigModel(model);
     }
 
     @Override
     public String remove(String id) {
-        List<Mapping> mappingAll = manager.getMappingAll();
+        List<Mapping> mappingAll = profileComponent.getMappingAll();
         if (!CollectionUtils.isEmpty(mappingAll)) {
             mappingAll.forEach(mapping -> {
                 if (StringUtil.equals(mapping.getSourceConnectorId(), id) || StringUtil.equals(mapping.getTargetConnectorId(), id)) {
@@ -88,21 +97,21 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
             });
         }
 
-        Connector connector = manager.getConnector(id);
+        Connector connector = profileComponent.getConnector(id);
         log(LogType.ConnectorLog.DELETE, connector);
 
-        manager.removeConfigModel(id);
+        profileComponent.removeConfigModel(id);
         return "删除连接器成功!";
     }
 
     @Override
     public Connector getConnector(String id) {
-        return StringUtil.isNotBlank(id) ? manager.getConnector(id) : null;
+        return StringUtil.isNotBlank(id) ? profileComponent.getConnector(id) : null;
     }
 
     @Override
     public List<Connector> getConnectorAll() {
-        List<Connector> list = manager.getConnectorAll()
+        List<Connector> list = profileComponent.getConnectorAll()
                 .stream()
                 .sorted(Comparator.comparing(Connector::getUpdateTime).reversed())
                 .collect(Collectors.toList());
@@ -112,13 +121,13 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
     @Override
     public List<String> getConnectorTypeAll() {
         List<String> list = new ArrayList<>();
-        manager.getConnectorEnumAll().forEach(c -> list.add(c.getType()));
+        profileComponent.getConnectorEnumAll().forEach(c -> list.add(c.getType()));
         return list;
     }
 
     @Override
     public void refreshHealth() {
-        List<Connector> list = manager.getConnectorAll();
+        List<Connector> list = profileComponent.getConnectorAll();
         if (CollectionUtils.isEmpty(list)) {
             if (!CollectionUtils.isEmpty(health)) {
                 health.clear();
@@ -129,7 +138,7 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
         // 更新连接器状态
         Set<String> exist = new HashSet<>();
         list.forEach(c -> {
-            health.put(c.getId(), manager.isAliveConnectorConfig(c.getConfig()));
+            health.put(c.getId(), isAliveConnectorConfig(c.getConfig()));
             exist.add(c.getId());
         });
 
@@ -150,4 +159,27 @@ public class ConnectorServiceImpl extends BaseServiceImpl implements ConnectorSe
     public boolean isAlive(String id) {
         return health.containsKey(id) && health.get(id);
     }
+
+    private boolean isAliveConnectorConfig(AbstractConnectorConfig config) {
+        boolean alive = false;
+        try {
+            alive = connectorFactory.isAlive(config);
+        } catch (Exception e) {
+            LogType.ConnectorLog logType = LogType.ConnectorLog.FAILED;
+            logService.log(logType, "%s%s", logType.getName(), e.getMessage());
+        }
+        // 断线重连
+        if (!alive) {
+            try {
+                alive = connectorFactory.refresh(config);
+            } catch (Exception e) {
+                logger.error(e.getMessage());
+            }
+            if (alive) {
+                logger.info(LogType.ConnectorLog.RECONNECT_SUCCESS.getMessage());
+            }
+        }
+        return alive;
+    }
+
 }

+ 5 - 5
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ConvertServiceImpl.java

@@ -1,11 +1,11 @@
 package org.dbsyncer.biz.impl;
 
 import org.dbsyncer.biz.ConvertService;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.ConvertEnum;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.Resource;
 import java.util.List;
 
 /**
@@ -16,12 +16,12 @@ import java.util.List;
 @Component
 public class ConvertServiceImpl implements ConvertService {
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Override
     public List<ConvertEnum> getConvertEnumAll() {
-        return manager.getConvertEnumAll();
+        return profileComponent.getConvertEnumAll();
     }
 
 }

+ 36 - 15
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/DataSyncServiceImpl.java

@@ -5,20 +5,24 @@ import org.dbsyncer.biz.DataSyncService;
 import org.dbsyncer.biz.vo.BinlogColumnVo;
 import org.dbsyncer.biz.vo.MessageVo;
 import org.dbsyncer.common.event.RowChangedEvent;
+import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.DateFormatUtil;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.NumberUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.model.Field;
-import org.dbsyncer.manager.Manager;
-import org.dbsyncer.monitor.Monitor;
-import org.dbsyncer.parser.Parser;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.parser.model.Picker;
 import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.binlog.proto.BinlogMap;
 import org.dbsyncer.storage.constant.ConfigConstant;
+import org.dbsyncer.storage.enums.IndexFieldResolverEnum;
+import org.dbsyncer.storage.enums.StorageEnum;
+import org.dbsyncer.storage.query.Query;
 import org.dbsyncer.storage.util.BinlogMessageUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +35,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -48,13 +53,13 @@ public class DataSyncServiceImpl implements DataSyncService {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Monitor monitor;
+    private ParserComponent parserComponent;
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
-    private Parser parser;
+    private StorageService storageService;
 
     @Override
     public MessageVo getMessageVo(String metaId, String messageId) {
@@ -63,10 +68,10 @@ public class DataSyncServiceImpl implements DataSyncService {
 
         MessageVo messageVo = new MessageVo();
         try {
-            Map row = monitor.getData(metaId, messageId);
+            Map row = getData(metaId, messageId);
             Map binlogData = getBinlogData(row, true);
             String tableGroupId = (String) row.get(ConfigConstant.DATA_TABLE_GROUP_ID);
-            TableGroup tableGroup = monitor.getTableGroup(tableGroupId);
+            TableGroup tableGroup = profileComponent.getTableGroup(tableGroupId);
             messageVo.setSourceTableName(tableGroup.getSourceTable().getName());
             messageVo.setTargetTableName(tableGroup.getTargetTable().getName());
             messageVo.setId(messageId);
@@ -87,7 +92,7 @@ public class DataSyncServiceImpl implements DataSyncService {
     public Map getBinlogData(Map row, boolean prettyBytes) throws InvalidProtocolBufferException {
         String tableGroupId = (String) row.get(ConfigConstant.DATA_TABLE_GROUP_ID);
         // 1、获取配置信息
-        final TableGroup tableGroup = manager.getTableGroup(tableGroupId);
+        final TableGroup tableGroup = profileComponent.getTableGroup(tableGroupId);
         if (tableGroup == null) {
             return Collections.EMPTY_MAP;
         }
@@ -141,7 +146,7 @@ public class DataSyncServiceImpl implements DataSyncService {
         Assert.hasText(messageId, "The messageId is null.");
 
         try {
-            Map row = monitor.getData(metaId, messageId);
+            Map row = getData(metaId, messageId);
             Map binlogData = getBinlogData(row, false);
             if (CollectionUtils.isEmpty(binlogData)) {
                 return messageId;
@@ -153,26 +158,42 @@ public class DataSyncServiceImpl implements DataSyncService {
             if (StringUtil.isNotBlank(retryDataParams)) {
                 JsonUtil.parseMap(retryDataParams).forEach((k, v) -> binlogData.put(k, convertValue(binlogData.get(k), (String) v)));
             }
-            TableGroup tableGroup = manager.getTableGroup(tableGroupId);
+            TableGroup tableGroup = profileComponent.getTableGroup(tableGroupId);
             String sourceTableName = tableGroup.getSourceTable().getName();
             RowChangedEvent changedEvent = new RowChangedEvent(sourceTableName, event, Collections.EMPTY_LIST);
             // 转换为源字段
             final Picker picker = new Picker(tableGroup.getFieldMapping());
             changedEvent.setChangedRow(picker.pickSourceData(binlogData));
-            parser.execute(tableGroupId, changedEvent);
-            monitor.removeData(metaId, messageId);
+            parserComponent.execute(tableGroupId, changedEvent);
+            storageService.remove(StorageEnum.DATA, metaId, messageId);
             // 更新失败数
-            Meta meta = manager.getMeta(metaId);
+            Meta meta = profileComponent.getMeta(metaId);
             Assert.notNull(meta, "Meta can not be null.");
             meta.getFail().decrementAndGet();
             meta.setUpdateTime(Instant.now().toEpochMilli());
-            manager.editConfigModel(meta);
+            profileComponent.editConfigModel(meta);
         } catch (Exception e) {
             logger.error(e.getLocalizedMessage());
         }
         return messageId;
     }
 
+    private Map getData(String metaId, String messageId) {
+        Query query = new Query(1, 1);
+        Map<String, IndexFieldResolverEnum> fieldResolvers = new LinkedHashMap<>();
+        fieldResolvers.put(ConfigConstant.BINLOG_DATA, IndexFieldResolverEnum.BINARY);
+        query.setIndexFieldResolverMap(fieldResolvers);
+        query.addFilter(ConfigConstant.CONFIG_MODEL_ID, messageId);
+        query.setMetaId(metaId);
+        query.setType(StorageEnum.DATA);
+        Paging paging = storageService.query(query);
+        if (!CollectionUtils.isEmpty(paging.getData())) {
+            List<Map> data = (List<Map>) paging.getData();
+            return data.get(0);
+        }
+        return Collections.EMPTY_MAP;
+    }
+
     private Object convertValue(Object oldValue, String newValue) {
         if (oldValue == null) {
             return newValue;

+ 42 - 30
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MappingServiceImpl.java

@@ -3,6 +3,7 @@ package org.dbsyncer.biz.impl;
 import org.dbsyncer.biz.BizException;
 import org.dbsyncer.biz.ConnectorService;
 import org.dbsyncer.biz.MappingService;
+import org.dbsyncer.biz.MonitorService;
 import org.dbsyncer.biz.TableGroupService;
 import org.dbsyncer.biz.checker.impl.mapping.MappingChecker;
 import org.dbsyncer.biz.vo.ConnectorVo;
@@ -13,6 +14,8 @@ import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.model.Table;
+import org.dbsyncer.manager.ManagerFactory;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
@@ -22,10 +25,10 @@ import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.parser.model.TableGroup;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.time.Instant;
 import java.util.Collections;
 import java.util.Comparator;
@@ -42,24 +45,33 @@ import java.util.stream.Collectors;
 @Service
 public class MappingServiceImpl extends BaseServiceImpl implements MappingService {
 
-    @Autowired
+    @Resource
     private MappingChecker mappingChecker;
 
-    @Autowired
+    @Resource
     private TableGroupService tableGroupService;
 
-    @Autowired
+    @Resource
     private ConnectorService connectorService;
 
-    @Autowired
+    @Resource
     private SnowflakeIdWorker snowflakeIdWorker;
 
+    @Resource
+    private ProfileComponent profileComponent;
+
+    @Resource
+    private MonitorService monitorService;
+
+    @Resource
+    private ManagerFactory managerFactory;
+
     @Override
     public String add(Map<String, String> params) {
         ConfigModel model = mappingChecker.checkAddConfigModel(params);
         log(LogType.MappingLog.INSERT, (Mapping) model);
 
-        String id = manager.addConfigModel(model);
+        String id = profileComponent.addConfigModel(model);
 
         // 匹配相似表 on
         String autoMatchTable = params.get("autoMatchTable");
@@ -72,7 +84,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
 
     @Override
     public String copy(String id) {
-        Mapping mapping = manager.getMapping(id);
+        Mapping mapping = profileComponent.getMapping(id);
         Assert.notNull(mapping, "The mapping id is invalid.");
 
         String json = JsonUtil.objToJson(mapping);
@@ -82,18 +94,18 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
         newMapping.setUpdateTime(Instant.now().toEpochMilli());
         mappingChecker.addMeta(newMapping);
 
-        manager.addConfigModel(newMapping);
+        profileComponent.addConfigModel(newMapping);
         log(LogType.MappingLog.COPY, newMapping);
 
         // 复制映射表关系
-        List<TableGroup> groupList = manager.getTableGroupAll(mapping.getId());
-        if(!CollectionUtils.isEmpty(groupList)){
+        List<TableGroup> groupList = profileComponent.getTableGroupAll(mapping.getId());
+        if (!CollectionUtils.isEmpty(groupList)) {
             groupList.forEach(tableGroup -> {
                 String tableGroupJson = JsonUtil.objToJson(tableGroup);
                 TableGroup newTableGroup = JsonUtil.jsonToObj(tableGroupJson, TableGroup.class);
                 newTableGroup.setId(String.valueOf(snowflakeIdWorker.nextId()));
                 newTableGroup.setMappingId(newMapping.getId());
-                manager.addTableGroup(newTableGroup);
+                profileComponent.addTableGroup(newTableGroup);
                 log(LogType.TableGroupLog.COPY, newTableGroup);
             });
         }
@@ -110,7 +122,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
             log(LogType.MappingLog.UPDATE, model);
 
             mappingChecker.batchMergeTableGroupConfig(model, params);
-            return manager.editConfigModel(model);
+            return profileComponent.editConfigModel(model);
         }
     }
 
@@ -118,26 +130,26 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
     public String remove(String id) {
         Mapping mapping = assertMappingExist(id);
         String metaId = mapping.getMetaId();
-        Meta meta = manager.getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         synchronized (LOCK) {
             assertRunning(metaId);
 
             // 删除数据
-            manager.clearData(metaId);
+            monitorService.clearData(metaId);
             log(LogType.MetaLog.CLEAR, meta);
 
             // 删除meta
-            manager.removeConfigModel(metaId);
+            profileComponent.removeConfigModel(metaId);
             log(LogType.MetaLog.DELETE, meta);
 
             // 删除tableGroup
-            List<TableGroup> groupList = manager.getTableGroupAll(id);
+            List<TableGroup> groupList = profileComponent.getTableGroupAll(id);
             if (!CollectionUtils.isEmpty(groupList)) {
-                groupList.forEach(t -> manager.removeTableGroup(t.getId()));
+                groupList.forEach(t -> profileComponent.removeTableGroup(t.getId()));
             }
 
             // 删除驱动
-            manager.removeConfigModel(id);
+            profileComponent.removeConfigModel(id);
             log(LogType.MappingLog.DELETE, mapping);
         }
         return "驱动删除成功";
@@ -145,13 +157,13 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
 
     @Override
     public MappingVo getMapping(String id) {
-        Mapping mapping = manager.getMapping(id);
+        Mapping mapping = profileComponent.getMapping(id);
         return convertMapping2Vo(mapping);
     }
 
     @Override
     public List<MappingVo> getMappingAll() {
-        List<MappingVo> list = manager.getMappingAll()
+        List<MappingVo> list = profileComponent.getMappingAll()
                 .stream()
                 .map(m -> convertMapping2Vo(m))
                 .sorted(Comparator.comparing(MappingVo::getUpdateTime).reversed())
@@ -170,7 +182,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
             assertRunning(metaId);
 
             // 启动
-            manager.start(mapping);
+            managerFactory.start(mapping);
 
             log(LogType.MappingLog.RUNNING, mapping);
         }
@@ -184,7 +196,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
             if (!isRunning(mapping.getMetaId())) {
                 throw new BizException("驱动已停止.");
             }
-            manager.close(mapping);
+            managerFactory.close(mapping);
 
             log(LogType.MappingLog.STOP, mapping);
 
@@ -198,8 +210,8 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
     private MappingVo convertMapping2Vo(Mapping mapping) {
         String model = mapping.getModel();
         Assert.notNull(mapping, "Mapping can not be null.");
-        Connector s = manager.getConnector(mapping.getSourceConnectorId());
-        Connector t = manager.getConnector(mapping.getTargetConnectorId());
+        Connector s = profileComponent.getConnector(mapping.getSourceConnectorId());
+        Connector t = profileComponent.getConnector(mapping.getTargetConnectorId());
         ConnectorVo sConn = new ConnectorVo(connectorService.isAlive(s.getId()));
         BeanUtils.copyProperties(s, sConn);
         ConnectorVo tConn = new ConnectorVo(connectorService.isAlive(t.getId()));
@@ -210,7 +222,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
         Collections.sort(tConn.getTable(), Comparator.comparing(Table::getName));
 
         // 元信息
-        Meta meta = manager.getMeta(mapping.getMetaId());
+        Meta meta = profileComponent.getMeta(mapping.getMetaId());
         Assert.notNull(meta, "Meta can not be null.");
         MetaVo metaVo = new MetaVo(ModelEnum.getModelEnum(model).getName(), mapping.getName());
         BeanUtils.copyProperties(meta, metaVo);
@@ -227,7 +239,7 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
      * @return
      */
     private Mapping assertMappingExist(String mappingId) {
-        Mapping mapping = manager.getMapping(mappingId);
+        Mapping mapping = profileComponent.getMapping(mappingId);
         Assert.notNull(mapping, "驱动不存在.");
         return mapping;
     }
@@ -239,8 +251,8 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
      */
     private void matchSimilarTable(ConfigModel model) {
         Mapping mapping = (Mapping) model;
-        Connector s = manager.getConnector(mapping.getSourceConnectorId());
-        Connector t = manager.getConnector(mapping.getTargetConnectorId());
+        Connector s = profileComponent.getConnector(mapping.getSourceConnectorId());
+        Connector t = profileComponent.getConnector(mapping.getTargetConnectorId());
         if (CollectionUtils.isEmpty(s.getTable()) || CollectionUtils.isEmpty(t.getTable())) {
             return;
         }
@@ -262,13 +274,13 @@ public class MappingServiceImpl extends BaseServiceImpl implements MappingServic
     }
 
     private void clearMetaIfFinished(String metaId) {
-        Meta meta = manager.getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         Assert.notNull(meta, "Mapping meta can not be null.");
         // 完成任务则重置状态
         if (meta.getTotal().get() <= (meta.getSuccess().get() + meta.getFail().get())) {
             meta.getFail().set(0);
             meta.getSuccess().set(0);
-            manager.editConfigModel(meta);
+            profileComponent.editConfigModel(meta);
         }
     }
 

+ 51 - 10
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java

@@ -30,12 +30,16 @@ import org.dbsyncer.monitor.enums.DiskMetricEnum;
 import org.dbsyncer.monitor.enums.MetricEnum;
 import org.dbsyncer.monitor.model.AppReportMetric;
 import org.dbsyncer.monitor.model.MetricResponse;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.MetaEnum;
 import org.dbsyncer.parser.enums.ModelEnum;
+import org.dbsyncer.parser.logger.LogService;
+import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.constant.ConfigConstant;
+import org.dbsyncer.storage.enums.IndexFieldResolverEnum;
 import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.BooleanFilter;
@@ -72,6 +76,9 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     @Resource
     private Monitor monitor;
 
+    @Resource
+    private ProfileComponent profileComponent;
+
     @Resource
     private DataSyncService dataSyncService;
 
@@ -81,6 +88,9 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     @Resource
     private StorageService storageService;
 
+    @Resource
+    private LogService logService;
+
     @Resource
     private SystemConfigService systemConfigService;
 
@@ -110,7 +120,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @Override
     public List<MetaVo> getMetaAll() {
-        List<MetaVo> list = monitor.getMetaAll()
+        List<MetaVo> list = profileComponent.getMetaAll()
                 .stream()
                 .map(m -> convertMeta2Vo(m))
                 .sorted(Comparator.comparing(MetaVo::getUpdateTime).reversed())
@@ -120,7 +130,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @Override
     public MetaVo getMetaVo(String metaId) {
-        Meta meta = monitor.getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         Assert.notNull(meta, "The meta is null.");
 
         return convertMeta2Vo(meta);
@@ -140,7 +150,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
         String error = params.get(ConfigConstant.DATA_ERROR);
         String success = params.get(ConfigConstant.DATA_SUCCESS);
 
-        Paging paging = monitor.queryData(getDefaultMetaId(id), pageNum, pageSize, error, success);
+        Paging paging = queryData(getDefaultMetaId(id), pageNum, pageSize, error, success);
         List<Map> data = (List<Map>) paging.getData();
         List<DataVo> list = new ArrayList<>();
         for (Map row : data) {
@@ -160,7 +170,12 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     @Override
     public String clearData(String id) {
         Assert.hasText(id, "驱动不存在.");
-        monitor.clearData(id);
+        Meta meta = profileComponent.getMeta(id);
+        Mapping mapping = profileComponent.getMapping(meta.getMappingId());
+        String model = ModelEnum.getModelEnum(mapping.getModel()).getName();
+        LogType.MappingLog log = LogType.MappingLog.CLEAR_DATA;
+        logService.log(log, "%s:%s(%s)", log.getMessage(), mapping.getName(), model);
+        storageService.clear(StorageEnum.DATA, id);
         return "清空同步数据成功";
     }
 
@@ -169,7 +184,12 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
         int pageNum = NumberUtil.toInt(params.get("pageNum"), 1);
         int pageSize = NumberUtil.toInt(params.get("pageSize"), 10);
         String json = params.get(ConfigConstant.CONFIG_MODEL_JSON);
-        Paging paging = monitor.queryLog(pageNum, pageSize, json);
+        Query query = new Query(pageNum, pageSize);
+        if (StringUtil.isNotBlank(json)) {
+            query.addFilter(ConfigConstant.CONFIG_MODEL_JSON, json, true);
+        }
+        query.setType(StorageEnum.LOG);
+        Paging paging = storageService.query(query);
         List<Map> data = (List<Map>) paging.getData();
         paging.setData(data.stream()
                 .map(m -> convert2Vo(m, LogVo.class))
@@ -179,7 +199,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @Override
     public String clearLog() {
-        monitor.clearLog();
+        storageService.clear(StorageEnum.LOG, null);
         return "清空日志成功";
     }
 
@@ -193,7 +213,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @Override
     public List<StorageDataStatusEnum> getStorageDataStatusEnumAll() {
-        return monitor.getStorageDataStatusEnumAll();
+        return profileComponent.getStorageDataStatusEnumAll();
     }
 
     @Override
@@ -213,7 +233,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     @Override
     public void run() {
         // 预警:驱动出现失败记录,发送通知消息
-        List<Meta> metaAll = monitor.getMetaAll();
+        List<Meta> metaAll = profileComponent.getMetaAll();
         if (CollectionUtils.isEmpty(metaAll)) {
             return;
         }
@@ -222,7 +242,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
         metaAll.forEach(meta -> {
             // 有失败记录
             if (MetaEnum.isRunning(meta.getState()) && meta.getFail().get() > 0) {
-                Mapping mapping = monitor.getMapping(meta.getMappingId());
+                Mapping mapping = profileComponent.getMapping(meta.getMappingId());
                 if (null != mapping) {
                     ModelEnum modelEnum = ModelEnum.getModelEnum(mapping.getModel());
                     content.append("<p>");
@@ -241,6 +261,27 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
         }
     }
 
+    private Paging queryData(String metaId, int pageNum, int pageSize, String error, String success) {
+        // 没有驱动
+        if (StringUtil.isBlank(metaId)) {
+            return new Paging(pageNum, pageSize);
+        }
+        Query query = new Query(pageNum, pageSize);
+        Map<String, IndexFieldResolverEnum> fieldResolvers = new LinkedHashMap<>();
+        fieldResolvers.put(ConfigConstant.BINLOG_DATA, IndexFieldResolverEnum.BINARY);
+        query.setIndexFieldResolverMap(fieldResolvers);
+
+        // 查询异常信息
+        if (StringUtil.isNotBlank(error)) {
+            query.addFilter(ConfigConstant.DATA_ERROR, error, true);
+        }
+        // 查询是否成功, 默认查询失败
+        query.addFilter(ConfigConstant.DATA_SUCCESS, StringUtil.isNotBlank(success) ? NumberUtil.toInt(success) : StorageDataStatusEnum.FAIL.getValue());
+        query.setMetaId(metaId);
+        query.setType(StorageEnum.DATA);
+        return storageService.query(query);
+    }
+
     private void deleteExpiredData() {
         List<MetaVo> metaAll = getMetaAll();
         if (!CollectionUtils.isEmpty(metaAll)) {
@@ -268,7 +309,7 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     }
 
     private MetaVo convertMeta2Vo(Meta meta) {
-        Mapping mapping = monitor.getMapping(meta.getMappingId());
+        Mapping mapping = profileComponent.getMapping(meta.getMappingId());
         Assert.notNull(mapping, "驱动不存在.");
         ModelEnum modelEnum = ModelEnum.getModelEnum(mapping.getModel());
         MetaVo metaVo = new MetaVo(modelEnum.getName(), mapping.getName());

+ 15 - 11
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/PluginServiceImpl.java

@@ -5,18 +5,19 @@ import org.dbsyncer.biz.PluginService;
 import org.dbsyncer.biz.vo.PluginVo;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.plugin.PluginFactory;
 import org.dbsyncer.plugin.config.Plugin;
 import org.dbsyncer.plugin.enums.FileSuffixEnum;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -31,15 +32,18 @@ import java.util.stream.Collectors;
 @Component
 public class PluginServiceImpl implements PluginService {
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private PluginFactory pluginFactory;
 
-    @Autowired
+    @Resource
+    private ProfileComponent profileComponent;
+
+    @Resource
     private LogService logService;
 
     @Override
     public List<PluginVo> getPluginAll() {
-        List<Plugin> pluginAll = manager.getPluginAll();
+        List<Plugin> pluginAll = pluginFactory.getPluginAll();
         List<PluginVo> vos = new ArrayList<>();
         if (!CollectionUtils.isEmpty(pluginAll)) {
             Map<String, List<String>> pluginClassNameMap = getPluginClassNameMap();
@@ -55,17 +59,17 @@ public class PluginServiceImpl implements PluginService {
 
     @Override
     public String getPluginPath() {
-        return manager.getPluginPath();
+        return pluginFactory.getPluginPath();
     }
 
     @Override
     public String getLibraryPath() {
-        return manager.getLibraryPath();
+        return pluginFactory.getLibraryPath();
     }
 
     @Override
     public void loadPlugins() {
-        manager.loadPlugins();
+        pluginFactory.loadPlugins();
         logService.log(LogType.PluginLog.UPDATE);
     }
 
@@ -84,7 +88,7 @@ public class PluginServiceImpl implements PluginService {
 
     private Map<String, List<String>> getPluginClassNameMap() {
         Map<String, List<String>> map = new HashMap<>();
-        List<Mapping> mappingAll = manager.getMappingAll();
+        List<Mapping> mappingAll = profileComponent.getMappingAll();
         if (CollectionUtils.isEmpty(mappingAll)) {
             return map;
         }
@@ -97,7 +101,7 @@ public class PluginServiceImpl implements PluginService {
                 continue;
             }
 
-            List<TableGroup> tableGroupAll = manager.getTableGroupAll(m.getId());
+            List<TableGroup> tableGroupAll = profileComponent.getTableGroupAll(m.getId());
             if (CollectionUtils.isEmpty(tableGroupAll)) {
                 continue;
             }

+ 18 - 14
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/ProjectGroupServiceImpl.java

@@ -8,17 +8,21 @@ import org.dbsyncer.biz.vo.MappingVo;
 import org.dbsyncer.biz.vo.ProjectGroupVo;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Connector;
 import org.dbsyncer.parser.model.ProjectGroup;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
-import java.util.*;
+import javax.annotation.Resource;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -31,16 +35,16 @@ import java.util.stream.Collectors;
 @Service
 public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectGroupService {
 
-    @Autowired
+    @Resource
     private ConnectorService connectorService;
 
-    @Autowired
+    @Resource
     private MappingService mappingService;
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
-    @Autowired
+    @Resource
     private Checker projectGroupChecker;
 
     @Override
@@ -48,7 +52,7 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
         ConfigModel model = projectGroupChecker.checkAddConfigModel(params);
         log(LogType.ConnectorLog.INSERT, model);
 
-        return manager.addConfigModel(model);
+        return profileComponent.addConfigModel(model);
     }
 
     @Override
@@ -56,15 +60,15 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
         ConfigModel model = projectGroupChecker.checkEditConfigModel(params);
         log(LogType.ConnectorLog.UPDATE, model);
 
-        return manager.editConfigModel(model);
+        return profileComponent.editConfigModel(model);
     }
 
     @Override
     public String remove(String id) {
-        ProjectGroup projectGroup = manager.getProjectGroup(id);
+        ProjectGroup projectGroup = profileComponent.getProjectGroup(id);
         log(LogType.ConnectorLog.DELETE, projectGroup);
         Assert.notNull(projectGroup, "该分组已被删除");
-        manager.removeConfigModel(id);
+        profileComponent.removeConfigModel(id);
         return "删除分组成功!";
     }
 
@@ -80,7 +84,7 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
             return vo;
         }
 
-        ProjectGroup projectGroup = manager.getProjectGroup(id);
+        ProjectGroup projectGroup = profileComponent.getProjectGroup(id);
         Assert.notNull(projectGroup, "该分组已被删除");
         BeanUtils.copyProperties(projectGroup, vo);
         vo.setConnectors(Collections.EMPTY_LIST);
@@ -115,7 +119,7 @@ public class ProjectGroupServiceImpl extends BaseServiceImpl implements ProjectG
 
     @Override
     public List<ProjectGroup> getProjectGroupAll() {
-        return manager.getProjectGroupAll();
+        return profileComponent.getProjectGroupAll();
     }
 
 }

+ 11 - 11
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/SystemConfigServiceImpl.java

@@ -6,12 +6,12 @@ import org.dbsyncer.biz.UserConfigService;
 import org.dbsyncer.biz.checker.Checker;
 import org.dbsyncer.biz.vo.SystemConfigVo;
 import org.dbsyncer.common.util.CollectionUtils;
-import org.dbsyncer.manager.Manager;
-import org.dbsyncer.manager.template.PreloadTemplate;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.SystemConfig;
+import org.dbsyncer.manager.template.PreloadTemplate;
 import org.dbsyncer.plugin.enums.FileSuffixEnum;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -35,13 +35,13 @@ import java.util.Map;
 public class SystemConfigServiceImpl implements SystemConfigService {
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
-    private Checker systemConfigChecker;
+    private PreloadTemplate preloadTemplate;
 
     @Resource
-    private PreloadTemplate preloadTemplate;
+    private Checker systemConfigChecker;
 
     @Resource
     private LogService logService;
@@ -52,7 +52,7 @@ public class SystemConfigServiceImpl implements SystemConfigService {
     @Override
     public String edit(Map<String, String> params) {
         ConfigModel model = systemConfigChecker.checkEditConfigModel(params);
-        manager.editConfigModel(model);
+        profileComponent.editConfigModel(model);
         return "修改成功.";
     }
 
@@ -66,9 +66,9 @@ public class SystemConfigServiceImpl implements SystemConfigService {
         List<ConfigModel> list = new ArrayList<>();
         list.add(getSystemConfig());
         list.add(userConfigService.getUserConfig());
-        manager.getConnectorAll().forEach(config -> list.add(config));
-        manager.getMappingAll().forEach(config -> list.add(config));
-        manager.getMetaAll().forEach(config -> list.add(config));
+        profileComponent.getConnectorAll().forEach(config -> list.add(config));
+        profileComponent.getMappingAll().forEach(config -> list.add(config));
+        profileComponent.getMetaAll().forEach(config -> list.add(config));
         return list;
     }
 
@@ -104,13 +104,13 @@ public class SystemConfigServiceImpl implements SystemConfigService {
     }
 
     private SystemConfig getSystemConfig() {
-        SystemConfig config = manager.getSystemConfig();
+        SystemConfig config = profileComponent.getSystemConfig();
         if (null != config) {
             return config;
         }
 
         synchronized (this) {
-            config = manager.getSystemConfig();
+            config = profileComponent.getSystemConfig();
             if (null == config) {
                 config = (SystemConfig) systemConfigChecker.checkAddConfigModel(new HashMap<>());
             }

+ 26 - 22
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/TableGroupServiceImpl.java

@@ -6,14 +6,15 @@ import org.dbsyncer.biz.checker.impl.tablegroup.TableGroupChecker;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.model.Field;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.TableGroup;
 import org.dbsyncer.storage.constant.ConfigConstant;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -29,15 +30,18 @@ import java.util.stream.Stream;
 @Service
 public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroupService {
 
-    @Autowired
+    @Resource
     private Checker tableGroupChecker;
 
+    @Resource
+    private ProfileComponent profileComponent;
+
     @Override
     public String add(Map<String, String> params) {
         String mappingId = params.get("mappingId");
-        assertRunning(manager.getMapping(mappingId));
+        assertRunning(profileComponent.getMapping(mappingId));
 
-        synchronized (LOCK){
+        synchronized (LOCK) {
             // table1, table2
             String[] sourceTableArray = StringUtil.split(params.get("sourceTable"), "|");
             String[] targetTableArray = StringUtil.split(params.get("targetTable"), "|");
@@ -50,9 +54,9 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
                 params.put("targetTable", targetTableArray[i]);
                 TableGroup model = (TableGroup) tableGroupChecker.checkAddConfigModel(params);
                 log(LogType.TableGroupLog.INSERT, model);
-                int tableGroupCount = manager.getTableGroupCount(mappingId);
+                int tableGroupCount = profileComponent.getTableGroupCount(mappingId);
                 model.setIndex(tableGroupCount + 1);
-                id = manager.addTableGroup(model);
+                id = profileComponent.addTableGroup(model);
             }
 
             // 合并驱动公共字段
@@ -64,39 +68,39 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
     @Override
     public String edit(Map<String, String> params) {
         String id = params.get(ConfigConstant.CONFIG_MODEL_ID);
-        TableGroup tableGroup = manager.getTableGroup(id);
+        TableGroup tableGroup = profileComponent.getTableGroup(id);
         Assert.notNull(tableGroup, "Can not find tableGroup.");
-        assertRunning(manager.getMapping(tableGroup.getMappingId()));
+        assertRunning(profileComponent.getMapping(tableGroup.getMappingId()));
 
         TableGroup model = (TableGroup) tableGroupChecker.checkEditConfigModel(params);
         log(LogType.TableGroupLog.UPDATE, model);
 
-        return manager.editTableGroup(model);
+        return profileComponent.editTableGroup(model);
     }
 
     @Override
     public String refreshFields(String id) {
-        TableGroup tableGroup = manager.getTableGroup(id);
+        TableGroup tableGroup = profileComponent.getTableGroup(id);
         Assert.notNull(tableGroup, "Can not find tableGroup.");
-        assertRunning(manager.getMapping(tableGroup.getMappingId()));
+        assertRunning(profileComponent.getMapping(tableGroup.getMappingId()));
 
         TableGroupChecker checker = (TableGroupChecker) tableGroupChecker;
         checker.refreshTableFields(tableGroup);
 
-        return manager.editTableGroup(tableGroup);
+        return profileComponent.editTableGroup(tableGroup);
     }
 
     @Override
     public boolean remove(String mappingId, String ids) {
         Assert.hasText(mappingId, "Mapping id can not be null");
         Assert.hasText(ids, "TableGroup ids can not be null");
-        assertRunning(manager.getMapping(mappingId));
+        assertRunning(profileComponent.getMapping(mappingId));
 
         // 批量删除表
         Stream.of(StringUtil.split(ids, ",")).parallel().forEach(id -> {
-            TableGroup model = manager.getTableGroup(id);
+            TableGroup model = profileComponent.getTableGroup(id);
             log(LogType.TableGroupLog.DELETE, model);
-            manager.removeTableGroup(id);
+            profileComponent.removeTableGroup(id);
         });
 
         // 合并驱动公共字段
@@ -109,34 +113,34 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
 
     @Override
     public TableGroup getTableGroup(String id) {
-        TableGroup tableGroup = manager.getTableGroup(id);
+        TableGroup tableGroup = profileComponent.getTableGroup(id);
         Assert.notNull(tableGroup, "TableGroup can not be null");
         return tableGroup;
     }
 
     @Override
     public List<TableGroup> getTableGroupAll(String mappingId) {
-        return manager.getSortedTableGroupAll(mappingId);
+        return profileComponent.getSortedTableGroupAll(mappingId);
     }
 
     private void resetTableGroupAllIndex(String mappingId) {
         synchronized (LOCK) {
-            List<TableGroup> list = manager.getSortedTableGroupAll(mappingId);
+            List<TableGroup> list = profileComponent.getSortedTableGroupAll(mappingId);
             int size = list.size();
             int i = size;
             while (i > 0) {
                 TableGroup g = list.get(size - i);
                 g.setIndex(i);
-                manager.editConfigModel(g);
+                profileComponent.editConfigModel(g);
                 i--;
             }
         }
     }
 
     private void mergeMappingColumn(String mappingId) {
-        List<TableGroup> groups = manager.getTableGroupAll(mappingId);
+        List<TableGroup> groups = profileComponent.getTableGroupAll(mappingId);
 
-        Mapping mapping = manager.getMapping(mappingId);
+        Mapping mapping = profileComponent.getMapping(mappingId);
         Assert.notNull(mapping, "mapping not exist.");
 
         List<Field> sourceColumn = null;
@@ -148,7 +152,7 @@ public class TableGroupServiceImpl extends BaseServiceImpl implements TableGroup
 
         mapping.setSourceColumn(sourceColumn);
         mapping.setTargetColumn(targetColumn);
-        manager.editConfigModel(mapping);
+        profileComponent.editConfigModel(mapping);
     }
 
     private List<Field> pickCommonFields(List<Field> column, List<Field> target) {

+ 12 - 12
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/UserConfigServiceImpl.java

@@ -7,16 +7,16 @@ import org.dbsyncer.biz.enums.UserRoleEnum;
 import org.dbsyncer.biz.vo.UserInfoVo;
 import org.dbsyncer.common.util.SHA1Util;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.Manager;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.UserConfig;
 import org.dbsyncer.parser.model.UserInfo;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -35,13 +35,13 @@ public class UserConfigServiceImpl implements UserConfigService {
 
     private static final String DEFAULT_PASSWORD = "0DPiKuNIrrVmD8IUCuw1hQxNqZc=";
 
-    @Autowired
-    private Manager manager;
+    @Resource
+    private ProfileComponent profileComponent;
 
-    @Autowired
+    @Resource
     private UserConfigChecker userConfigChecker;
 
-    @Autowired
+    @Resource
     private LogService logService;
 
     @Override
@@ -64,7 +64,7 @@ public class UserConfigServiceImpl implements UserConfigService {
         userConfig.getUserInfoList().add(new UserInfo(username, nickname, SHA1Util.b64_sha1(password), UserRoleEnum.USER.getCode(), mail));
 
         logService.log(LogType.UserLog.INSERT, String.format("[%s]添加[%s]账号成功", currentUser.getUsername(), username));
-        return manager.editConfigModel(userConfig);
+        return profileComponent.editConfigModel(userConfig);
     }
 
     @Override
@@ -107,7 +107,7 @@ public class UserConfigServiceImpl implements UserConfigService {
             logService.log(LogType.UserLog.UPDATE, String.format("[%s]修改[%s]账号密码成功", currentUser.getUsername(), username));
         }
 
-        return manager.editConfigModel(userConfig);
+        return profileComponent.editConfigModel(userConfig);
     }
 
     @Override
@@ -127,7 +127,7 @@ public class UserConfigServiceImpl implements UserConfigService {
         UserInfo deleteUser = userConfig.getUserInfo(username);
         Assert.notNull(deleteUser, "用户已删除.");
         userConfig.removeUserInfo(username);
-        manager.editConfigModel(userConfig);
+        profileComponent.editConfigModel(userConfig);
         logService.log(LogType.UserLog.DELETE, String.format("[%s]删除[%s]账号成功", currentUser.getUsername(), username));
         return "删除用户成功!";
     }
@@ -168,18 +168,18 @@ public class UserConfigServiceImpl implements UserConfigService {
 
     @Override
     public UserConfig getUserConfig() {
-        UserConfig config = manager.getUserConfig();
+        UserConfig config = profileComponent.getUserConfig();
         if (null != config) {
             return config;
         }
 
         synchronized (this) {
-            config = manager.getUserConfig();
+            config = profileComponent.getUserConfig();
             if (null == config) {
                 config = (UserConfig) userConfigChecker.checkAddConfigModel(new HashMap<>());
                 UserRoleEnum admin = UserRoleEnum.ADMIN;
                 config.getUserInfoList().add(new UserInfo(DEFAULT_USERNAME, DEFAULT_USERNAME, DEFAULT_PASSWORD, admin.getCode(), ""));
-                manager.addConfigModel(config);
+                profileComponent.addConfigModel(config);
             }
             return config;
         }

+ 0 - 7
dbsyncer-manager/src/main/java/org/dbsyncer/manager/Command.java

@@ -1,7 +0,0 @@
-package org.dbsyncer.manager;
-
-import org.dbsyncer.manager.command.Persistence;
-import org.dbsyncer.manager.command.Preload;
-
-public interface Command extends Persistence, Preload {
-}

+ 0 - 6
dbsyncer-manager/src/main/java/org/dbsyncer/manager/CommandExecutor.java

@@ -1,6 +0,0 @@
-package org.dbsyncer.manager;
-
-public interface CommandExecutor {
-
-    Object execute(Command cmd);
-}

+ 0 - 37
dbsyncer-manager/src/main/java/org/dbsyncer/manager/Executor.java

@@ -1,37 +0,0 @@
-package org.dbsyncer.manager;
-
-import org.dbsyncer.parser.enums.MetaEnum;
-import org.dbsyncer.parser.model.Mapping;
-
-/**
- * 同步任务执行器
- *
- * @author AE86
- * @version 1.0.0
- * @date 2020/04/26 16:32
- */
-public interface Executor {
-
-    /**
-     * 启动同步任务
-     *
-     * @param mapping
-     */
-    void start(Mapping mapping);
-
-    /**
-     * 关闭同步任务
-     *
-     * @param mapping
-     */
-    void close(Mapping mapping);
-
-    /**
-     * 切换meta状态
-     *
-     * @param metaId
-     * @param metaEnum
-     */
-    void changeMetaState(String metaId, MetaEnum metaEnum);
-
-}

+ 0 - 149
dbsyncer-manager/src/main/java/org/dbsyncer/manager/Manager.java

@@ -1,149 +0,0 @@
-package org.dbsyncer.manager;
-
-import org.dbsyncer.common.model.AbstractConnectorConfig;
-import org.dbsyncer.common.model.Paging;
-import org.dbsyncer.common.spi.ConnectorMapper;
-import org.dbsyncer.connector.enums.ConnectorEnum;
-import org.dbsyncer.connector.enums.FilterEnum;
-import org.dbsyncer.connector.enums.OperationEnum;
-import org.dbsyncer.connector.model.MetaInfo;
-import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.listener.enums.QuartzFilterEnum;
-import org.dbsyncer.parser.enums.ConvertEnum;
-import org.dbsyncer.parser.model.*;
-import org.dbsyncer.plugin.config.Plugin;
-import org.dbsyncer.storage.enums.StorageDataStatusEnum;
-import org.dbsyncer.storage.query.Query;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * 驱动配置
- *
- * @author AE86
- * @version 1.0.0
- * @date 2019/9/30 20:31
- */
-public interface Manager extends Executor {
-
-    /**
-     * 添加ConfigModel
-     *
-     * @param model
-     * @return id
-     */
-    String addConfigModel(ConfigModel model);
-
-    /**
-     * 编辑ConfigModel
-     *
-     * @param model
-     * @return id
-     */
-    String editConfigModel(ConfigModel model);
-
-    /**
-     * 刪除ConfigModel
-     *
-      * @param id
-     * @return
-     */
-    void removeConfigModel(String id);
-
-    // system
-    SystemConfig getSystemConfig();
-
-    // user
-    UserConfig getUserConfig();
-
-    // project group
-    ProjectGroup getProjectGroup(String id);
-
-    List<ProjectGroup> getProjectGroupAll();
-
-    // Connector
-    ConnectorMapper connect(AbstractConnectorConfig config);
-
-    boolean refreshConnectorConfig(AbstractConnectorConfig config);
-
-    boolean isAliveConnectorConfig(AbstractConnectorConfig config);
-
-    List<Table> getTable(ConnectorMapper config);
-
-    MetaInfo getMetaInfo(String connectorId, String tableName);
-
-    Connector getConnector(String connectorId);
-
-    List<Connector> getConnectorAll();
-
-    void checkAllConnectorStatus();
-
-    // Mapping
-    Mapping getMapping(String mappingId);
-
-    List<Mapping> getMappingAll();
-
-    // TableGroup
-    String addTableGroup(TableGroup model);
-
-    String editTableGroup(TableGroup model);
-
-    void removeTableGroup(String id);
-
-    TableGroup getTableGroup(String tableGroupId);
-
-    List<TableGroup> getTableGroupAll(String mappingId);
-
-    List<TableGroup> getSortedTableGroupAll(String mappingId);
-
-    int getTableGroupCount(String mappingId);
-
-    Map<String, String> getCommand(Mapping mapping, TableGroup tableGroup);
-
-    long getCount(String connectorId, Map<String, String> command);
-
-    // Meta
-    Meta getMeta(String metaId);
-
-    List<Meta> getMetaAll();
-
-    // Data
-    Paging queryData(Query query);
-
-    void removeData(String metaId, String messageId);
-
-    void clearData(String metaId);
-
-    // Log
-    Paging queryLog(Query query);
-
-    void clearLog();
-
-    // ConnectorEnum
-    List<ConnectorEnum> getConnectorEnumAll();
-
-    // OperationEnum
-    List<OperationEnum> getOperationEnumAll();
-
-    // QuartzFilterEnum
-    List<QuartzFilterEnum> getQuartzFilterEnumAll();
-
-    // FilterEnum
-    List<FilterEnum> getFilterEnumAll();
-
-    // ConvertEnum
-    List<ConvertEnum> getConvertEnumAll();
-
-    // StorageDataStatusEnum
-    List<StorageDataStatusEnum> getStorageDataStatusEnumAll();
-
-    // Plugin
-    List<Plugin> getPluginAll();
-
-    String getPluginPath();
-
-    String getLibraryPath();
-
-    void loadPlugins();
-}

+ 10 - 300
dbsyncer-manager/src/main/java/org/dbsyncer/manager/ManagerFactory.java

@@ -1,44 +1,15 @@
 package org.dbsyncer.manager;
 
-import org.dbsyncer.common.event.ClosedEvent;
-import org.dbsyncer.common.model.AbstractConnectorConfig;
-import org.dbsyncer.common.model.Paging;
-import org.dbsyncer.common.spi.ConnectorMapper;
-import org.dbsyncer.common.util.CollectionUtils;
-import org.dbsyncer.connector.enums.ConnectorEnum;
-import org.dbsyncer.connector.enums.FilterEnum;
-import org.dbsyncer.connector.enums.OperationEnum;
-import org.dbsyncer.connector.model.MetaInfo;
-import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.listener.enums.QuartzFilterEnum;
-import org.dbsyncer.manager.enums.CommandEnum;
-import org.dbsyncer.manager.enums.GroupStrategyEnum;
-import org.dbsyncer.manager.model.OperationConfig;
-import org.dbsyncer.manager.model.QueryConfig;
-import org.dbsyncer.manager.template.OperationTemplate;
-import org.dbsyncer.parser.Parser;
-import org.dbsyncer.parser.enums.ConvertEnum;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.MetaEnum;
-import org.dbsyncer.parser.enums.ModelEnum;
-import org.dbsyncer.parser.logger.LogService;
-import org.dbsyncer.parser.logger.LogType;
-import org.dbsyncer.parser.model.*;
-import org.dbsyncer.plugin.PluginFactory;
-import org.dbsyncer.plugin.config.Plugin;
-import org.dbsyncer.storage.StorageService;
-import org.dbsyncer.storage.enums.StorageDataStatusEnum;
-import org.dbsyncer.storage.enums.StorageEnum;
-import org.dbsyncer.storage.query.Query;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationListener;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.time.Instant;
-import java.util.Comparator;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * @author AE86
@@ -46,267 +17,14 @@ import java.util.stream.Collectors;
  * @date 2019/9/16 23:59
  */
 @Component
-public class ManagerFactory implements Manager, ApplicationListener<ClosedEvent> {
+public class ManagerFactory {
 
-    @Autowired
-    private Parser parser;
+    @Resource
+    private ProfileComponent profileComponent;
 
-    @Autowired
-    private PluginFactory pluginFactory;
-
-    @Autowired
-    private OperationTemplate operationTemplate;
-
-    @Autowired
-    private StorageService storageService;
-
-    @Autowired
-    private LogService logService;
-
-    @Autowired
+    @Resource
     private Map<String, Puller> map;
 
-    @Override
-    public String addConfigModel(ConfigModel model) {
-        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD));
-    }
-
-    @Override
-    public String editConfigModel(ConfigModel model) {
-        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_EDIT));
-    }
-
-    @Override
-    public void removeConfigModel(String id) {
-        operationTemplate.remove(new OperationConfig(id));
-    }
-
-    @Override
-    public SystemConfig getSystemConfig() {
-        List<SystemConfig> list = operationTemplate.queryAll(SystemConfig.class);
-        return CollectionUtils.isEmpty(list) ? null : list.get(0);
-    }
-
-    @Override
-    public UserConfig getUserConfig() {
-        List<UserConfig> list = operationTemplate.queryAll(UserConfig.class);
-        return CollectionUtils.isEmpty(list) ? null : list.get(0);
-    }
-
-    @Override
-    public ProjectGroup getProjectGroup(String id) {
-        return operationTemplate.queryObject(ProjectGroup.class, id);
-    }
-
-    @Override
-    public List<ProjectGroup> getProjectGroupAll() {
-        return operationTemplate.queryAll(ProjectGroup.class);
-    }
-
-    @Override
-    public ConnectorMapper connect(AbstractConnectorConfig config) {
-        return parser.connect(config);
-    }
-
-    @Override
-    public boolean refreshConnectorConfig(AbstractConnectorConfig config) {
-        return parser.refreshConnectorConfig(config);
-    }
-
-    @Override
-    public boolean isAliveConnectorConfig(AbstractConnectorConfig config) {
-        return parser.isAliveConnectorConfig(config);
-    }
-
-    @Override
-    public List<Table> getTable(ConnectorMapper config) {
-        return parser.getTable(config);
-    }
-
-    @Override
-    public MetaInfo getMetaInfo(String connectorId, String tableName) {
-        return parser.getMetaInfo(connectorId, tableName);
-    }
-
-    @Override
-    public Connector getConnector(String connectorId) {
-        return operationTemplate.queryObject(Connector.class, connectorId);
-    }
-
-    @Override
-    public List<Connector> getConnectorAll() {
-        return operationTemplate.queryAll(Connector.class);
-    }
-
-    @Override
-    public void checkAllConnectorStatus() {
-        List<Connector> list = getConnectorAll();
-        if (!CollectionUtils.isEmpty(list)) {
-            list.forEach(c -> {
-                try {
-                    refreshConnectorConfig(c.getConfig());
-                } catch (Exception e) {
-                    LogType.ConnectorLog logType = LogType.ConnectorLog.FAILED;
-                    logService.log(logType, "%s%s", logType.getName(), e.getMessage());
-                }
-            });
-        }
-    }
-
-    @Override
-    public Mapping getMapping(String mappingId) {
-        return operationTemplate.queryObject(Mapping.class, mappingId);
-    }
-
-    @Override
-    public List<Mapping> getMappingAll() {
-        return operationTemplate.queryAll(Mapping.class);
-    }
-
-    @Override
-    public String addTableGroup(TableGroup model) {
-        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, GroupStrategyEnum.TABLE));
-    }
-
-    @Override
-    public String editTableGroup(TableGroup model) {
-        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_EDIT, GroupStrategyEnum.TABLE));
-    }
-
-    @Override
-    public void removeTableGroup(String id) {
-        operationTemplate.remove(new OperationConfig(id, GroupStrategyEnum.TABLE));
-    }
-
-    @Override
-    public TableGroup getTableGroup(String tableGroupId) {
-        return operationTemplate.queryObject(TableGroup.class, tableGroupId);
-    }
-
-    @Override
-    public List<TableGroup> getTableGroupAll(String mappingId) {
-        TableGroup tableGroup = new TableGroup().setMappingId(mappingId);
-        return operationTemplate.queryAll(new QueryConfig(tableGroup, GroupStrategyEnum.TABLE));
-    }
-
-    @Override
-    public List<TableGroup> getSortedTableGroupAll(String mappingId) {
-        List<TableGroup> list = getTableGroupAll(mappingId)
-                .stream()
-                .sorted(Comparator.comparing(TableGroup::getIndex).reversed())
-                .collect(Collectors.toList());
-        return list;
-    }
-
-    @Override
-    public int getTableGroupCount(String mappingId) {
-        TableGroup tableGroup = new TableGroup().setMappingId(mappingId);
-        return operationTemplate.queryCount(new QueryConfig<>(tableGroup, GroupStrategyEnum.TABLE));
-    }
-
-    @Override
-    public Map<String, String> getCommand(Mapping mapping, TableGroup tableGroup) {
-        return parser.getCommand(mapping, tableGroup);
-    }
-
-    @Override
-    public long getCount(String connectorId, Map<String, String> command) {
-        return parser.getCount(connectorId, command);
-    }
-
-    @Override
-    public Meta getMeta(String metaId) {
-        return operationTemplate.queryObject(Meta.class, metaId);
-    }
-
-    @Override
-    public List<Meta> getMetaAll() {
-        return operationTemplate.queryAll(Meta.class);
-    }
-
-    @Override
-    public Paging queryData(Query query) {
-        query.setType(StorageEnum.DATA);
-        return storageService.query(query);
-    }
-
-    @Override
-    public void removeData(String metaId, String messageId) {
-        storageService.remove(StorageEnum.DATA, metaId, messageId);
-    }
-
-    @Override
-    public void clearData(String metaId) {
-        Meta meta = getMeta(metaId);
-        Mapping mapping = getMapping(meta.getMappingId());
-        String model = ModelEnum.getModelEnum(mapping.getModel()).getName();
-        LogType.MappingLog log = LogType.MappingLog.CLEAR_DATA;
-        logService.log(log, "%s:%s(%s)", log.getMessage(), mapping.getName(), model);
-        storageService.clear(StorageEnum.DATA, metaId);
-    }
-
-    @Override
-    public Paging queryLog(Query query) {
-        query.setType(StorageEnum.LOG);
-        return storageService.query(query);
-    }
-
-    @Override
-    public void clearLog() {
-        storageService.clear(StorageEnum.LOG, null);
-    }
-
-    @Override
-    public List<ConnectorEnum> getConnectorEnumAll() {
-        return parser.getConnectorEnumAll();
-    }
-
-    @Override
-    public List<OperationEnum> getOperationEnumAll() {
-        return parser.getOperationEnumAll();
-    }
-
-    @Override
-    public List<QuartzFilterEnum> getQuartzFilterEnumAll() {
-        return parser.getQuartzFilterEnumAll();
-    }
-
-    @Override
-    public List<FilterEnum> getFilterEnumAll() {
-        return parser.getFilterEnumAll();
-    }
-
-    @Override
-    public List<ConvertEnum> getConvertEnumAll() {
-        return parser.getConvertEnumAll();
-    }
-
-    @Override
-    public List<StorageDataStatusEnum> getStorageDataStatusEnumAll() {
-        return parser.getStorageDataStatusEnumAll();
-    }
-
-    @Override
-    public List<Plugin> getPluginAll() {
-        return pluginFactory.getPluginAll();
-    }
-
-    @Override
-    public String getPluginPath() {
-        return pluginFactory.getPluginPath();
-    }
-
-    @Override
-    public String getLibraryPath() {
-        return pluginFactory.getLibraryPath();
-    }
-
-    @Override
-    public void loadPlugins() {
-        pluginFactory.loadPlugins();
-    }
-
-    @Override
     public void start(Mapping mapping) {
         Puller puller = getPuller(mapping);
 
@@ -316,7 +34,6 @@ public class ManagerFactory implements Manager, ApplicationListener<ClosedEvent>
         puller.start(mapping);
     }
 
-    @Override
     public void close(Mapping mapping) {
         Puller puller = getPuller(mapping);
 
@@ -327,23 +44,16 @@ public class ManagerFactory implements Manager, ApplicationListener<ClosedEvent>
         puller.close(metaId);
     }
 
-    @Override
     public void changeMetaState(String metaId, MetaEnum metaEnum) {
-        Meta meta = getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         int code = metaEnum.getCode();
         if (null != meta && meta.getState() != code) {
             meta.setState(code);
             meta.setUpdateTime(Instant.now().toEpochMilli());
-            editConfigModel(meta);
+            profileComponent.editConfigModel(meta);
         }
     }
 
-    @Override
-    public void onApplicationEvent(ClosedEvent event) {
-        // 异步监听任务关闭事件
-        changeMetaState(event.getMetaId(), MetaEnum.READY);
-    }
-
     private Puller getPuller(Mapping mapping) {
         Assert.notNull(mapping, "驱动不能为空");
         String model = mapping.getModel();

+ 0 - 14
dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/Persistence.java

@@ -1,14 +0,0 @@
-package org.dbsyncer.manager.command;
-
-import org.dbsyncer.manager.ManagerException;
-
-public interface Persistence {
-
-    default boolean addConfig() {
-        throw new ManagerException("Unsupported method addConfig");
-    }
-
-    default boolean editConfig() {
-        throw new ManagerException("Unsupported method editConfig");
-    }
-}

+ 0 - 35
dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/Preload.java

@@ -1,35 +0,0 @@
-package org.dbsyncer.manager.command;
-
-import org.dbsyncer.manager.ManagerException;
-import org.dbsyncer.parser.model.*;
-
-public interface Preload {
-
-    default SystemConfig parseSystemConfig(){
-        throw new ManagerException("Unsupported method parseSystemConfig");
-    }
-
-    default UserConfig parseUserConfig(){
-        throw new ManagerException("Unsupported method parseUserConfig");
-    }
-
-    default Connector parseConnector(){
-        throw new ManagerException("Unsupported method parseConnector");
-    }
-
-    default Mapping parseMapping(){
-        throw new ManagerException("Unsupported method parseMapping");
-    }
-
-    default TableGroup parseTableGroup(){
-        throw new ManagerException("Unsupported method parseTableGroup");
-    }
-
-    default Meta parseMeta(){
-        throw new ManagerException("Unsupported method parseMeta");
-    }
-
-    default ProjectGroup parseProjectGroup(){
-        throw new ManagerException("Unsupported method parseProjectGroup");
-    }
-}

+ 0 - 59
dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/PreloadCommand.java

@@ -1,59 +0,0 @@
-package org.dbsyncer.manager.command;
-
-import org.dbsyncer.manager.Command;
-import org.dbsyncer.parser.Parser;
-import org.dbsyncer.parser.model.Connector;
-import org.dbsyncer.parser.model.Mapping;
-import org.dbsyncer.parser.model.Meta;
-import org.dbsyncer.parser.model.ProjectGroup;
-import org.dbsyncer.parser.model.SystemConfig;
-import org.dbsyncer.parser.model.TableGroup;
-import org.dbsyncer.parser.model.UserConfig;
-
-public class PreloadCommand implements Command {
-
-    private Parser parser;
-
-    private String json;
-
-    public PreloadCommand(Parser parser, String json) {
-        this.parser = parser;
-        this.json = json;
-    }
-
-    @Override
-    public SystemConfig parseSystemConfig() {
-        return parser.parseObject(json, SystemConfig.class);
-    }
-
-    @Override
-    public UserConfig parseUserConfig() {
-        return parser.parseObject(json, UserConfig.class);
-    }
-
-    @Override
-    public Connector parseConnector() {
-        return parser.parseConnector(json);
-    }
-
-    @Override
-    public Mapping parseMapping() {
-        return parser.parseObject(json, Mapping.class);
-    }
-
-    @Override
-    public TableGroup parseTableGroup() {
-        return parser.parseObject(json, TableGroup.class);
-    }
-
-    @Override
-    public Meta parseMeta() {
-        return parser.parseObject(json, Meta.class);
-    }
-
-    @Override
-    public ProjectGroup parseProjectGroup() {
-        return parser.parseObject(json, ProjectGroup.class);
-    }
-
-}

+ 29 - 0
dbsyncer-manager/src/main/java/org/dbsyncer/manager/listener/ClosedTaskListener.java

@@ -0,0 +1,29 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.manager.listener;
+
+import org.dbsyncer.common.event.ClosedEvent;
+import org.dbsyncer.manager.ManagerFactory;
+import org.dbsyncer.parser.enums.MetaEnum;
+import org.springframework.context.ApplicationListener;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-14 01:48
+ */
+@Component
+public class ClosedTaskListener implements ApplicationListener<ClosedEvent> {
+
+    @Resource
+    private ManagerFactory managerFactory;
+
+    @Override
+    public void onApplicationEvent(ClosedEvent event) {
+        managerFactory.changeMetaState(event.getMetaId(), MetaEnum.READY);
+    }
+}

+ 9 - 9
dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/FullPuller.java

@@ -3,8 +3,8 @@ package org.dbsyncer.manager.puller;
 import org.dbsyncer.common.util.NumberUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.util.PrimaryKeyUtil;
-import org.dbsyncer.manager.Manager;
-import org.dbsyncer.parser.Parser;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.enums.ParserEnum;
 import org.dbsyncer.parser.event.FullRefreshEvent;
 import org.dbsyncer.parser.logger.LogService;
@@ -41,10 +41,10 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Parser parser;
+    private ParserComponent parserComponent;
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
     private LogService logService;
@@ -57,7 +57,7 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
             final String metaId = mapping.getMetaId();
             ExecutorService executor = null;
             try {
-                List<TableGroup> list = manager.getSortedTableGroupAll(mapping.getId());
+                List<TableGroup> list = profileComponent.getSortedTableGroupAll(mapping.getId());
                 Assert.notEmpty(list, "映射关系不能为空");
                 logger.info("开始全量同步:{}, {}", metaId, mapping.getName());
                 map.putIfAbsent(metaId, new Task(metaId));
@@ -106,7 +106,7 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
         task.setEndTime(now);
 
         // 获取上次同步点
-        Meta meta = manager.getMeta(task.getId());
+        Meta meta = profileComponent.getMeta(task.getId());
         Map<String, String> snapshot = meta.getSnapshot();
         task.setPageIndex(NumberUtil.toInt(snapshot.get(ParserEnum.PAGE_INDEX.getCode()), ParserEnum.PAGE_INDEX.getDefaultValue()));
         // 反序列化游标值类型(通常为数字或字符串类型)
@@ -117,7 +117,7 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
 
         int i = task.getTableGroupIndex();
         while (i < list.size()) {
-            parser.execute(task, mapping, list.get(i), executor);
+            parserComponent.execute(task, mapping, list.get(i), executor);
             if (!task.isRunning()) {
                 break;
             }
@@ -134,7 +134,7 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
     }
 
     private void flush(Task task) {
-        Meta meta = manager.getMeta(task.getId());
+        Meta meta = profileComponent.getMeta(task.getId());
         Assert.notNull(meta, "检查meta为空.");
 
         // 全量的过程中,有新数据则更新总数
@@ -150,7 +150,7 @@ public final class FullPuller extends AbstractPuller implements ApplicationListe
         snapshot.put(ParserEnum.PAGE_INDEX.getCode(), String.valueOf(task.getPageIndex()));
         snapshot.put(ParserEnum.CURSOR.getCode(), StringUtil.join(task.getCursors(), ","));
         snapshot.put(ParserEnum.TABLE_GROUP_INDEX.getCode(), String.valueOf(task.getTableGroupIndex()));
-        manager.editConfigModel(meta);
+        profileComponent.editConfigModel(meta);
     }
 
 }

+ 11 - 149
dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/IncrementPuller.java

@@ -1,13 +1,7 @@
 package org.dbsyncer.manager.puller;
 
-import org.dbsyncer.common.event.ChangedEvent;
 import org.dbsyncer.common.event.ChangedOffset;
-import org.dbsyncer.common.event.CommonChangedEvent;
-import org.dbsyncer.common.event.DDLChangedEvent;
 import org.dbsyncer.common.event.RefreshOffsetEvent;
-import org.dbsyncer.common.event.RowChangedEvent;
-import org.dbsyncer.common.event.ScanChangedEvent;
-import org.dbsyncer.common.event.Watcher;
 import org.dbsyncer.common.model.AbstractConnectorConfig;
 import org.dbsyncer.common.scheduled.ScheduledTaskJob;
 import org.dbsyncer.common.scheduled.ScheduledTaskService;
@@ -21,16 +15,17 @@ import org.dbsyncer.listener.config.ListenerConfig;
 import org.dbsyncer.listener.enums.ListenerTypeEnum;
 import org.dbsyncer.listener.quartz.AbstractQuartzExtractor;
 import org.dbsyncer.listener.quartz.TableGroupQuartzCommand;
-import org.dbsyncer.manager.Manager;
 import org.dbsyncer.manager.ManagerException;
-import org.dbsyncer.manager.model.FieldPicker;
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.consumer.impl.LogConsumer;
+import org.dbsyncer.parser.consumer.impl.QuartzConsumer;
+import org.dbsyncer.parser.flush.impl.BufferActuatorRouter;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.Connector;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.parser.model.TableGroup;
-import org.dbsyncer.parser.util.PickerUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationListener;
@@ -42,13 +37,10 @@ import javax.annotation.Resource;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 /**
@@ -67,7 +59,7 @@ public final class IncrementPuller extends AbstractPuller implements Application
     private Listener listener;
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
     private LogService logService;
@@ -93,11 +85,11 @@ public final class IncrementPuller extends AbstractPuller implements Application
         final String mappingId = mapping.getId();
         final String metaId = mapping.getMetaId();
         logger.info("开始增量同步:{}, {}", metaId, mapping.getName());
-        Connector connector = manager.getConnector(mapping.getSourceConnectorId());
+        Connector connector = profileComponent.getConnector(mapping.getSourceConnectorId());
         Assert.notNull(connector, "连接器不能为空.");
-        List<TableGroup> list = manager.getSortedTableGroupAll(mappingId);
+        List<TableGroup> list = profileComponent.getSortedTableGroupAll(mappingId);
         Assert.notEmpty(list, "映射关系不能为空.");
-        Meta meta = manager.getMeta(metaId);
+        Meta meta = profileComponent.getMeta(metaId);
         Assert.notNull(meta, "Meta不能为空.");
 
         Thread worker = new Thread(() -> {
@@ -105,7 +97,7 @@ public final class IncrementPuller extends AbstractPuller implements Application
                 long now = Instant.now().toEpochMilli();
                 meta.setBeginTime(now);
                 meta.setEndTime(now);
-                manager.editConfigModel(meta);
+                profileComponent.editConfigModel(meta);
                 map.putIfAbsent(metaId, getExtractor(mapping, connector, list, meta));
                 map.get(metaId).start();
             } catch (Exception e) {
@@ -160,14 +152,14 @@ public final class IncrementPuller extends AbstractPuller implements Application
         if (ListenerTypeEnum.isTiming(listenerType)) {
             AbstractQuartzExtractor quartzExtractor = listener.getExtractor(ListenerTypeEnum.TIMING, connectorConfig.getConnectorType(), AbstractQuartzExtractor.class);
             quartzExtractor.setCommands(list.stream().map(t -> new TableGroupQuartzCommand(t.getSourceTable(), t.getCommand())).collect(Collectors.toList()));
-            quartzExtractor.register(new QuartzConsumer(meta, mapping, list));
+            quartzExtractor.register(new QuartzConsumer().init(bufferActuatorRouter, profileComponent, logService, meta, mapping, list));
             extractor = quartzExtractor;
         }
 
         // 基于日志抽取
         if (ListenerTypeEnum.isLog(listenerType)) {
             extractor = listener.getExtractor(ListenerTypeEnum.LOG, connectorConfig.getConnectorType(), AbstractExtractor.class);
-            extractor.register(new LogConsumer(meta, mapping, list));
+            extractor.register(new LogConsumer().init(bufferActuatorRouter, profileComponent, logService, meta, mapping, list));
         }
 
         if (null != extractor) {
@@ -195,134 +187,4 @@ public final class IncrementPuller extends AbstractPuller implements Application
         throw new ManagerException("未知的监听配置.");
     }
 
-    abstract class AbstractConsumer<E extends ChangedEvent> implements Watcher {
-        protected Meta meta;
-
-        public abstract void onChange(E e);
-
-        public void onDDLChanged(DDLChangedEvent event) {
-        }
-
-        @Override
-        public void changeEvent(ChangedEvent event) {
-            event.getChangedOffset().setMetaId(meta.getId());
-            if (event instanceof DDLChangedEvent) {
-                onDDLChanged((DDLChangedEvent) event);
-                return;
-            }
-            onChange((E) event);
-        }
-
-        @Override
-        public void flushEvent(Map<String, String> snapshot) {
-            meta.setSnapshot(snapshot);
-            manager.editConfigModel(meta);
-        }
-
-        @Override
-        public void errorEvent(Exception e) {
-            logService.log(LogType.TableGroupLog.INCREMENT_FAILED, e.getMessage());
-        }
-
-        @Override
-        public long getMetaUpdateTime() {
-            return meta.getUpdateTime();
-        }
-
-        protected void bind(String tableGroupId) {
-            bufferActuatorRouter.bind(meta.getId(), tableGroupId);
-        }
-
-        protected void execute(String tableGroupId, ChangedEvent event) {
-            bufferActuatorRouter.execute(meta.getId(), tableGroupId, event);
-        }
-
-    }
-
-    final class QuartzConsumer extends AbstractConsumer<ScanChangedEvent> {
-        private List<FieldPicker> tablePicker = new LinkedList<>();
-
-        public QuartzConsumer(Meta meta, Mapping mapping, List<TableGroup> tableGroups) {
-            this.meta = meta;
-            tableGroups.forEach(t -> {
-                tablePicker.add(new FieldPicker(PickerUtil.mergeTableGroupConfig(mapping, t)));
-                bind(t.getId());
-            });
-        }
-
-        @Override
-        public void onChange(ScanChangedEvent event) {
-            final FieldPicker picker = tablePicker.get(event.getTableGroupIndex());
-            TableGroup tableGroup = picker.getTableGroup();
-            event.setSourceTableName(tableGroup.getSourceTable().getName());
-
-            // 定时暂不支持触发刷新增量点事件
-            execute(tableGroup.getId(), event);
-        }
-    }
-
-    final class LogConsumer extends AbstractConsumer<RowChangedEvent> {
-        private Mapping mapping;
-        private List<TableGroup> tableGroups;
-        private Map<String, List<FieldPicker>> tablePicker = new LinkedHashMap<>();
-
-        //判断上次是否为ddl,是ddl需要强制刷新下picker
-        private boolean ddlChanged;
-
-        public LogConsumer(Meta meta, Mapping mapping, List<TableGroup> tableGroups) {
-            this.tableGroups = tableGroups;
-            this.meta = meta;
-            this.mapping = mapping;
-            addTablePicker(true);
-        }
-
-        @Override
-        public void onChange(RowChangedEvent event) {
-            // 需要强制刷新 fix https://gitee.com/ghi/dbsyncer/issues/I8DJUR
-            if (ddlChanged) {
-                addTablePicker(false);
-                ddlChanged = false;
-            }
-            process(event, picker -> {
-                final Map<String, Object> changedRow = picker.getColumns(event.getDataList());
-                if (picker.filter(changedRow)) {
-                    event.setChangedRow(changedRow);
-                    execute(picker.getTableGroup().getId(), event);
-                }
-            });
-        }
-
-        @Override
-        public void onDDLChanged(DDLChangedEvent event) {
-            ddlChanged = true;
-            process(event, picker -> execute(picker.getTableGroup().getId(), event));
-        }
-
-        private void process(CommonChangedEvent event, Consumer<FieldPicker> consumer) {
-            // 处理过程有异常向上抛
-            List<FieldPicker> pickers = tablePicker.get(event.getSourceTableName());
-            if (!CollectionUtils.isEmpty(pickers)) {
-                // 触发刷新增量点事件
-                event.getChangedOffset().setRefreshOffset(true);
-                pickers.forEach(picker -> consumer.accept(picker));
-            }
-        }
-
-        private void addTablePicker(boolean bindBufferActuatorRouter) {
-            this.tablePicker.clear();
-            this.tableGroups.forEach(t -> {
-                final Table table = t.getSourceTable();
-                final String tableName = table.getName();
-                tablePicker.putIfAbsent(tableName, new ArrayList<>());
-                TableGroup group = PickerUtil.mergeTableGroupConfig(mapping, t);
-                tablePicker.get(tableName).add(new FieldPicker(group, group.getFilter(), table.getColumn(), group.getFieldMapping()));
-                // 是否注册到路由服务中
-                if (bindBufferActuatorRouter) {
-                    bind(group.getId());
-                }
-            });
-        }
-
-    }
-
 }

+ 70 - 70
dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/PreloadTemplate.java

@@ -4,17 +4,18 @@ import org.dbsyncer.common.event.PreloadCompletedEvent;
 import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
-import org.dbsyncer.manager.Manager;
-import org.dbsyncer.manager.command.PreloadCommand;
-import org.dbsyncer.manager.enums.CommandEnum;
-import org.dbsyncer.manager.enums.GroupStrategyEnum;
-import org.dbsyncer.manager.model.OperationConfig;
-import org.dbsyncer.manager.template.OperationTemplate.Group;
-import org.dbsyncer.parser.Parser;
+import org.dbsyncer.manager.ManagerFactory;
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.command.PreloadCommand;
+import org.dbsyncer.parser.enums.CommandEnum;
+import org.dbsyncer.parser.enums.GroupStrategyEnum;
 import org.dbsyncer.parser.enums.MetaEnum;
 import org.dbsyncer.parser.model.ConfigModel;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.OperationConfig;
+import org.dbsyncer.parser.template.OperationTemplate;
+import org.dbsyncer.plugin.PluginFactory;
 import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.dbsyncer.storage.enums.StorageEnum;
@@ -44,21 +45,75 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Parser parser;
+    private OperationTemplate operationTemplate;
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
-    private StorageService storageService;
+    private ManagerFactory managerFactory;
 
     @Resource
-    private OperationTemplate operationTemplate;
+    private PluginFactory pluginFactory;
+
+    @Resource
+    private StorageService storageService;
 
     @Resource
     private ApplicationContext applicationContext;
 
-    public void execute(CommandEnum commandEnum) {
+    @Override
+    public void onApplicationEvent(ContextRefreshedEvent event) {
+        // Load configModels
+        Arrays.stream(CommandEnum.values()).filter(commandEnum -> commandEnum.isPreload()).forEach(commandEnum -> execute(commandEnum));
+
+        // Load plugins
+        pluginFactory.loadPlugins();
+
+        // Launch drivers
+        launch();
+
+        // publish event
+        applicationContext.publishEvent(new PreloadCompletedEvent(applicationContext));
+    }
+
+    public void reload(String json) {
+        Map<String, Map> map = JsonUtil.jsonToObj(json, Map.class);
+        if (CollectionUtils.isEmpty(map)) {
+            return;
+        }
+
+        // Load system
+        reload(map, CommandEnum.PRELOAD_SYSTEM);
+        // Load user
+        reload(map, CommandEnum.PRELOAD_USER);
+        // Load connectors
+        reload(map, CommandEnum.PRELOAD_CONNECTOR);
+        // Load mappings
+        reload(map, CommandEnum.PRELOAD_MAPPING);
+        // Load metas
+        reload(map, CommandEnum.PRELOAD_META);
+        // Load projectGroups
+        reload(map, CommandEnum.PRELOAD_PROJECT_GROUP);
+        launch();
+    }
+
+    private void launch() {
+        List<Meta> metas = profileComponent.getMetaAll();
+        if (!CollectionUtils.isEmpty(metas)) {
+            metas.forEach(m -> {
+                // 恢复驱动状态
+                if (MetaEnum.RUNNING.getCode() == m.getState()) {
+                    Mapping mapping = profileComponent.getMapping(m.getMappingId());
+                    managerFactory.start(mapping);
+                } else if (MetaEnum.STOPPING.getCode() == m.getState()) {
+                    managerFactory.changeMetaState(m.getId(), MetaEnum.READY);
+                }
+            });
+        }
+    }
+
+    private void execute(CommandEnum commandEnum) {
         Query query = new Query();
         query.setType(StorageEnum.CONFIG);
         String modelType = commandEnum.getModelType();
@@ -77,7 +132,7 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
             }
             data.forEach(map -> {
                 String json = (String) map.get(ConfigConstant.CONFIG_MODEL_JSON);
-                ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, json));
+                ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(profileComponent, json));
                 if (null != model) {
                     operationTemplate.cache(model, commandEnum.getGroupStrategyEnum());
                 }
@@ -88,27 +143,6 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
         logger.info("PreLoad {}:{}", modelType, total);
     }
 
-    public void reload(String json) {
-        Map<String, Map> map = JsonUtil.jsonToObj(json, Map.class);
-        if (CollectionUtils.isEmpty(map)) {
-            return;
-        }
-
-        // Load system
-        reload(map, CommandEnum.PRELOAD_SYSTEM);
-        // Load user
-        reload(map, CommandEnum.PRELOAD_USER);
-        // Load connectors
-        reload(map, CommandEnum.PRELOAD_CONNECTOR);
-        // Load mappings
-        reload(map, CommandEnum.PRELOAD_MAPPING);
-        // Load metas
-        reload(map, CommandEnum.PRELOAD_META);
-        // Load projectGroups
-        reload(map, CommandEnum.PRELOAD_PROJECT_GROUP);
-        launch();
-    }
-
     private void reload(Map<String, Map> map, CommandEnum commandEnum) {
         reload(map, commandEnum, commandEnum.getModelType());
     }
@@ -118,7 +152,7 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
         if (null == config) {
             return;
         }
-        Group group = JsonUtil.jsonToObj(config.toString(), Group.class);
+        OperationTemplate.Group group = JsonUtil.jsonToObj(config.toString(), OperationTemplate.Group.class);
         if (null == group) {
             return;
         }
@@ -130,7 +164,7 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
 
         for (String e : index) {
             Map m = map.get(e);
-            ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(parser, m.toString()));
+            ConfigModel model = (ConfigModel) commandEnum.getCommandExecutor().execute(new PreloadCommand(profileComponent, m.toString()));
             operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, commandEnum.getGroupStrategyEnum()));
             // Load tableGroups
             if (CommandEnum.PRELOAD_MAPPING == commandEnum) {
@@ -138,38 +172,4 @@ public final class PreloadTemplate implements ApplicationListener<ContextRefresh
             }
         }
     }
-
-    private void launch() {
-        List<Meta> metas = manager.getMetaAll();
-        if (!CollectionUtils.isEmpty(metas)) {
-            metas.forEach(m -> {
-                // 恢复驱动状态
-                if (MetaEnum.RUNNING.getCode() == m.getState()) {
-                    Mapping mapping = manager.getMapping(m.getMappingId());
-                    manager.start(mapping);
-                } else if (MetaEnum.STOPPING.getCode() == m.getState()) {
-                    manager.changeMetaState(m.getId(), MetaEnum.READY);
-                }
-            });
-        }
-    }
-
-    @Override
-    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
-        // Load configModels
-        Arrays.stream(CommandEnum.values()).filter(commandEnum -> commandEnum.isPreload()).forEach(commandEnum -> execute(commandEnum));
-
-        // Load plugins
-        manager.loadPlugins();
-
-        // Check connectors status
-        manager.checkAllConnectorStatus();
-
-        // Launch drivers
-        launch();
-
-        // publish event
-        applicationContext.publishEvent(new PreloadCompletedEvent(applicationContext));
-    }
-
 }

+ 0 - 28
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/Monitor.java

@@ -1,16 +1,10 @@
 package org.dbsyncer.monitor;
 
-import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.monitor.enums.MetricEnum;
 import org.dbsyncer.monitor.model.AppReportMetric;
 import org.dbsyncer.monitor.model.MetricResponse;
-import org.dbsyncer.parser.model.Mapping;
-import org.dbsyncer.parser.model.Meta;
-import org.dbsyncer.parser.model.TableGroup;
-import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 
 import java.util.List;
-import java.util.Map;
 
 /**
  * @author AE86
@@ -19,28 +13,6 @@ import java.util.Map;
  */
 public interface Monitor {
 
-    Mapping getMapping(String mappingId);
-
-    TableGroup getTableGroup(String tableGroupId);
-
-    List<Meta> getMetaAll();
-
-    Meta getMeta(String metaId);
-
-    Paging queryData(String metaId, int pageNum, int pageSize, String error, String success);
-
-    Map getData(String metaId, String messageId);
-
-    void removeData(String metaId, String messageId);
-
-    void clearData(String metaId);
-
-    Paging queryLog(int pageNum, int pageSize, String json);
-
-    void clearLog();
-
-    List<StorageDataStatusEnum> getStorageDataStatusEnumAll();
-
     List<MetricEnum> getMetricEnumAll();
 
     List<MetricResponse> getMetricInfo();

+ 12 - 99
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/MonitorFactory.java

@@ -4,11 +4,8 @@ import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.scheduled.ScheduledTaskJob;
 import org.dbsyncer.common.scheduled.ScheduledTaskService;
 import org.dbsyncer.common.util.CollectionUtils;
-import org.dbsyncer.common.util.NumberUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.constant.ConnectorConstant;
-import org.dbsyncer.manager.Manager;
-import org.dbsyncer.manager.puller.BufferActuatorRouter;
 import org.dbsyncer.monitor.enums.BufferActuatorMetricEnum;
 import org.dbsyncer.monitor.enums.MetricEnum;
 import org.dbsyncer.monitor.enums.StatisticEnum;
@@ -18,13 +15,15 @@ import org.dbsyncer.monitor.model.MappingReportMetric;
 import org.dbsyncer.monitor.model.MetricResponse;
 import org.dbsyncer.monitor.model.MetricResponseInfo;
 import org.dbsyncer.monitor.model.Sample;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.flush.BufferActuator;
+import org.dbsyncer.parser.flush.impl.BufferActuatorRouter;
 import org.dbsyncer.parser.flush.impl.TableGroupBufferActuator;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.constant.ConfigConstant;
-import org.dbsyncer.storage.enums.IndexFieldResolverEnum;
 import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.Query;
@@ -38,11 +37,8 @@ import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Comparator;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Consumer;
@@ -59,7 +55,7 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Resource
-    private Manager manager;
+    private ProfileComponent profileComponent;
 
     @Resource
     private BufferActuator generalBufferActuator;
@@ -73,6 +69,9 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
     @Resource
     private ScheduledTaskService scheduledTaskService;
 
+    @Resource
+    private StorageService storageService;
+
     private volatile boolean running;
 
     private LocalDateTime queryTime;
@@ -86,92 +85,6 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         scheduledTaskService.start(5000, this);
     }
 
-    @Override
-    public Mapping getMapping(String mappingId) {
-        return manager.getMapping(mappingId);
-    }
-
-    @Override
-    public TableGroup getTableGroup(String tableGroupId) {
-        return manager.getTableGroup(tableGroupId);
-    }
-
-    @Override
-    public List<Meta> getMetaAll() {
-        return manager.getMetaAll();
-    }
-
-    @Override
-    public Meta getMeta(String metaId) {
-        return manager.getMeta(metaId);
-    }
-
-    @Override
-    public Paging queryData(String metaId, int pageNum, int pageSize, String error, String success) {
-        // 没有驱动
-        if (StringUtil.isBlank(metaId)) {
-            return new Paging(pageNum, pageSize);
-        }
-        Query query = new Query(pageNum, pageSize);
-        Map<String, IndexFieldResolverEnum> fieldResolvers = new LinkedHashMap<>();
-        fieldResolvers.put(ConfigConstant.BINLOG_DATA, IndexFieldResolverEnum.BINARY);
-        query.setIndexFieldResolverMap(fieldResolvers);
-
-        // 查询异常信息
-        if (StringUtil.isNotBlank(error)) {
-            query.addFilter(ConfigConstant.DATA_ERROR, error, true);
-        }
-        // 查询是否成功, 默认查询失败
-        query.addFilter(ConfigConstant.DATA_SUCCESS, StringUtil.isNotBlank(success) ? NumberUtil.toInt(success) : StorageDataStatusEnum.FAIL.getValue());
-        query.setMetaId(metaId);
-        return manager.queryData(query);
-    }
-
-    @Override
-    public Map getData(String metaId, String messageId) {
-        Query query = new Query(1, 1);
-        Map<String, IndexFieldResolverEnum> fieldResolvers = new LinkedHashMap<>();
-        fieldResolvers.put(ConfigConstant.BINLOG_DATA, IndexFieldResolverEnum.BINARY);
-        query.setIndexFieldResolverMap(fieldResolvers);
-        query.addFilter(ConfigConstant.CONFIG_MODEL_ID, messageId);
-        query.setMetaId(metaId);
-        Paging paging = manager.queryData(query);
-        if (!CollectionUtils.isEmpty(paging.getData())) {
-            List<Map> data = (List<Map>) paging.getData();
-            return data.get(0);
-        }
-        return Collections.EMPTY_MAP;
-    }
-
-    @Override
-    public void removeData(String metaId, String messageId) {
-        manager.removeData(metaId, messageId);
-    }
-
-    @Override
-    public void clearData(String metaId) {
-        manager.clearData(metaId);
-    }
-
-    @Override
-    public Paging queryLog(int pageNum, int pageSize, String json) {
-        Query query = new Query(pageNum, pageSize);
-        if (StringUtil.isNotBlank(json)) {
-            query.addFilter(ConfigConstant.CONFIG_MODEL_JSON, json, true);
-        }
-        return manager.queryLog(query);
-    }
-
-    @Override
-    public void clearLog() {
-        manager.clearLog();
-    }
-
-    @Override
-    public List<StorageDataStatusEnum> getStorageDataStatusEnumAll() {
-        return manager.getStorageDataStatusEnumAll();
-    }
-
     @Override
     public List<MetricEnum> getMetricEnumAll() {
         return Arrays.asList(MetricEnum.values());
@@ -188,12 +101,12 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
             List<MetricResponseInfo> tableList = new ArrayList<>();
             String tableGroupCode = BufferActuatorMetricEnum.TABLE_GROUP.getCode();
             bufferActuatorRouter.getRouter().forEach((metaId, group) -> {
-                Meta meta = manager.getMeta(metaId);
-                Mapping mapping = manager.getMapping(meta.getMappingId());
+                Meta meta = profileComponent.getMeta(metaId);
+                Mapping mapping = profileComponent.getMapping(meta.getMappingId());
                 group.forEach((k, bufferActuator) -> {
                     if (bufferActuator instanceof TableGroupBufferActuator) {
                         TableGroupBufferActuator actuator = bufferActuator;
-                        TableGroup tableGroup = manager.getTableGroup(actuator.getTableGroupId());
+                        TableGroup tableGroup = profileComponent.getTableGroup(actuator.getTableGroupId());
                         String metricName = new StringBuilder()
                                 .append(tableGroup.getSourceTable().getName())
                                 .append(" > ")
@@ -241,7 +154,7 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         // 刷新报表
         try {
             running = true;
-            final List<Meta> metaAll = manager.getMetaAll();
+            final List<Meta> metaAll = profileComponent.getMetaAll();
             mappingReportMetric.setSuccess(getMappingSuccess(metaAll));
             mappingReportMetric.setFail(getMappingFail(metaAll));
             mappingReportMetric.setInsert(getMappingInsert(metaAll));
@@ -313,7 +226,7 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
             operation.accept(query);
             metaAll.forEach(meta -> {
                 query.setMetaId(meta.getId());
-                Paging paging = manager.queryData(query);
+                Paging paging = storageService.query(query);
                 total.getAndAdd(paging.getTotal());
             });
         }

+ 5 - 92
dbsyncer-parser/src/main/java/org/dbsyncer/parser/Parser.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserComponent.java

@@ -1,57 +1,30 @@
 package org.dbsyncer.parser;
 
 import org.dbsyncer.common.event.ChangedEvent;
-import org.dbsyncer.common.model.AbstractConnectorConfig;
 import org.dbsyncer.common.model.Result;
 import org.dbsyncer.common.spi.ConnectorMapper;
 import org.dbsyncer.common.spi.ConvertContext;
-import org.dbsyncer.connector.enums.ConnectorEnum;
-import org.dbsyncer.connector.enums.FilterEnum;
-import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.connector.model.Table;
-import org.dbsyncer.listener.enums.QuartzFilterEnum;
-import org.dbsyncer.parser.enums.ConvertEnum;
 import org.dbsyncer.parser.model.BatchWriter;
-import org.dbsyncer.parser.model.Connector;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.TableGroup;
 import org.dbsyncer.parser.model.Task;
-import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executor;
 
 /**
+ * <pre>
+ *     实现全量和增量同步任务,以及连接器读写,插件转换,表元信息,心跳检测
+ * </pre>
+ *
  * @author AE86
  * @version 1.0.0
  * @date 2019/10/20 21:11
  */
-public interface Parser {
-
-    /**
-     * 获取连接配置
-     *
-     * @param config
-     * @return
-     */
-    ConnectorMapper connect(AbstractConnectorConfig config);
-
-    /**
-     * 刷新连接配置
-     *
-     * @param config
-     */
-    boolean refreshConnectorConfig(AbstractConnectorConfig config);
-
-    /**
-     * 连接配置是否可用
-     *
-     * @param config
-     * @return
-     */
-    boolean isAliveConnectorConfig(AbstractConnectorConfig config);
+public interface ParserComponent {
 
     /**
      * 获取连接器表
@@ -88,66 +61,6 @@ public interface Parser {
      */
     long getCount(String connectorId, Map<String, String> command);
 
-    /**
-     * 解析连接器配置为Connector
-     *
-     * @param json
-     * @return
-     */
-    Connector parseConnector(String json);
-
-    /**
-     * 解析配置
-     *
-     * @param json
-     * @param clazz
-     * @param <T>
-     * @return
-     */
-    <T> T parseObject(String json, Class<T> clazz);
-
-    /**
-     * 获取所有连接器类型
-     *
-     * @return
-     */
-    List<ConnectorEnum> getConnectorEnumAll();
-
-    /**
-     * 获取所有条件类型
-     *
-     * @return
-     */
-    List<OperationEnum> getOperationEnumAll();
-
-    /**
-     * 获取过滤条件系统参数
-     *
-     * @return
-     */
-    List<QuartzFilterEnum> getQuartzFilterEnumAll();
-
-    /**
-     * 获取所有运算符类型
-     *
-     * @return
-     */
-    List<FilterEnum> getFilterEnumAll();
-
-    /**
-     * 获取所有转换类型
-     *
-     * @return
-     */
-    List<ConvertEnum> getConvertEnumAll();
-
-    /**
-     * 获取所有同步数据状态类型
-     *
-     * @return
-     */
-    List<StorageDataStatusEnum> getStorageDataStatusEnumAll();
-
     /**
      * 全量同步
      *

+ 187 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ProfileComponent.java

@@ -0,0 +1,187 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser;
+
+import org.dbsyncer.connector.enums.ConnectorEnum;
+import org.dbsyncer.connector.enums.FilterEnum;
+import org.dbsyncer.connector.enums.OperationEnum;
+import org.dbsyncer.listener.enums.QuartzFilterEnum;
+import org.dbsyncer.parser.enums.ConvertEnum;
+import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.ProjectGroup;
+import org.dbsyncer.parser.model.SystemConfig;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.model.UserConfig;
+import org.dbsyncer.storage.constant.ConfigConstant;
+import org.dbsyncer.storage.enums.StorageDataStatusEnum;
+
+import java.util.List;
+
+/**
+ * 配置文件组件(system/user/connector/mapping/tableGroup/meta/projectGroup)
+ * <p>
+ * {@link ConfigConstant}
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-13 20:48
+ */
+public interface ProfileComponent {
+
+    /**
+     * 解析连接器配置为Connector
+     *
+     * @param json
+     * @return
+     */
+    Connector parseConnector(String json);
+
+    /**
+     * 解析配置
+     *
+     * @param json
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    <T> T parseObject(String json, Class<T> clazz);
+
+    /**
+     * 添加ConfigModel
+     *
+     * @param model
+     * @return id
+     */
+    String addConfigModel(ConfigModel model);
+
+    /**
+     * 编辑ConfigModel
+     *
+     * @param model
+     * @return id
+     */
+    String editConfigModel(ConfigModel model);
+
+    /**
+     * 刪除ConfigModel
+     *
+     * @param id
+     * @return
+     */
+    void removeConfigModel(String id);
+
+    /**
+     * 获取系统配置
+     *
+     * @return
+     */
+    SystemConfig getSystemConfig();
+
+    /**
+     * 获取用户配置
+     *
+     * @return
+     */
+    UserConfig getUserConfig();
+
+    /**
+     * 根据ID获取分组配置
+     *
+     * @param id
+     * @return
+     */
+    ProjectGroup getProjectGroup(String id);
+
+    /**
+     * 获取所有的分组配置
+     *
+     * @return
+     */
+    List<ProjectGroup> getProjectGroupAll();
+
+    /**
+     * 根据ID获取连接器
+     *
+     * @param connectorId
+     * @return
+     */
+    Connector getConnector(String connectorId);
+
+    /**
+     * 获取所有的连接器
+     *
+     * @return
+     */
+    List<Connector> getConnectorAll();
+
+    // Mapping
+    Mapping getMapping(String mappingId);
+
+    List<Mapping> getMappingAll();
+
+    // TableGroup
+    String addTableGroup(TableGroup model);
+
+    String editTableGroup(TableGroup model);
+
+    void removeTableGroup(String id);
+
+    TableGroup getTableGroup(String tableGroupId);
+
+    List<TableGroup> getTableGroupAll(String mappingId);
+
+    List<TableGroup> getSortedTableGroupAll(String mappingId);
+
+    int getTableGroupCount(String mappingId);
+
+    // Meta
+    Meta getMeta(String metaId);
+
+    List<Meta> getMetaAll();
+
+    /**
+     * 获取所有连接器类型
+     *
+     * @return
+     */
+    List<ConnectorEnum> getConnectorEnumAll();
+
+    /**
+     * 获取所有条件类型
+     *
+     * @return
+     */
+    List<OperationEnum> getOperationEnumAll();
+
+    /**
+     * 获取过滤条件系统参数
+     *
+     * @return
+     */
+    List<QuartzFilterEnum> getQuartzFilterEnumAll();
+
+    /**
+     * 获取所有运算符类型
+     *
+     * @return
+     */
+    List<FilterEnum> getFilterEnumAll();
+
+    /**
+     * 获取所有转换类型
+     *
+     * @return
+     */
+    List<ConvertEnum> getConvertEnumAll();
+
+    /**
+     * 获取所有同步数据状态类型
+     *
+     * @return
+     */
+    List<StorageDataStatusEnum> getStorageDataStatusEnumAll();
+}

+ 14 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Command.java

@@ -0,0 +1,14 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
+
+/**
+ * 命令模式接口
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public interface Command extends Persistence, Preload {
+}

+ 14 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/CommandExecutor.java

@@ -0,0 +1,14 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
+
+/**
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public interface CommandExecutor {
+
+    Object execute(Command cmd);
+}

+ 24 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Persistence.java

@@ -0,0 +1,24 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
+
+import org.dbsyncer.parser.ParserException;
+
+/**
+ * 序列化接口
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public interface Persistence {
+
+    default boolean addConfig() {
+        throw new ParserException("Unsupported method addConfig");
+    }
+
+    default boolean editConfig() {
+        throw new ParserException("Unsupported method editConfig");
+    }
+}

+ 11 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/command/PersistenceCommand.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/PersistenceCommand.java

@@ -1,11 +1,20 @@
-package org.dbsyncer.manager.command;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
 
-import org.dbsyncer.manager.Command;
 import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.enums.StorageEnum;
 
 import java.util.Map;
 
+/**
+ * 配置序列化
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
 public class PersistenceCommand implements Command {
 
     private StorageService storageService;

+ 51 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/Preload.java

@@ -0,0 +1,51 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
+
+import org.dbsyncer.parser.ParserException;
+import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.ProjectGroup;
+import org.dbsyncer.parser.model.SystemConfig;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.model.UserConfig;
+
+/**
+ * 预加载接口
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public interface Preload {
+
+    default SystemConfig parseSystemConfig(){
+        throw new ParserException("Unsupported method parseSystemConfig");
+    }
+
+    default UserConfig parseUserConfig(){
+        throw new ParserException("Unsupported method parseUserConfig");
+    }
+
+    default Connector parseConnector(){
+        throw new ParserException("Unsupported method parseConnector");
+    }
+
+    default Mapping parseMapping(){
+        throw new ParserException("Unsupported method parseMapping");
+    }
+
+    default TableGroup parseTableGroup(){
+        throw new ParserException("Unsupported method parseTableGroup");
+    }
+
+    default Meta parseMeta(){
+        throw new ParserException("Unsupported method parseMeta");
+    }
+
+    default ProjectGroup parseProjectGroup(){
+        throw new ParserException("Unsupported method parseProjectGroup");
+    }
+}

+ 68 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/command/PreloadCommand.java

@@ -0,0 +1,68 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.command;
+
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.ProjectGroup;
+import org.dbsyncer.parser.model.SystemConfig;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.model.UserConfig;
+
+/**
+ * 预加载接口
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public class PreloadCommand implements Command {
+
+    private ProfileComponent profileComponent;
+
+    private String json;
+
+    public PreloadCommand(ProfileComponent profileComponent, String json) {
+        this.profileComponent = profileComponent;
+        this.json = json;
+    }
+
+    @Override
+    public SystemConfig parseSystemConfig() {
+        return profileComponent.parseObject(json, SystemConfig.class);
+    }
+
+    @Override
+    public UserConfig parseUserConfig() {
+        return profileComponent.parseObject(json, UserConfig.class);
+    }
+
+    @Override
+    public Connector parseConnector() {
+        return profileComponent.parseConnector(json);
+    }
+
+    @Override
+    public Mapping parseMapping() {
+        return profileComponent.parseObject(json, Mapping.class);
+    }
+
+    @Override
+    public TableGroup parseTableGroup() {
+        return profileComponent.parseObject(json, TableGroup.class);
+    }
+
+    @Override
+    public Meta parseMeta() {
+        return profileComponent.parseObject(json, Meta.class);
+    }
+
+    @Override
+    public ProjectGroup parseProjectGroup() {
+        return profileComponent.parseObject(json, ProjectGroup.class);
+    }
+
+}

+ 84 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/AbstractConsumer.java

@@ -0,0 +1,84 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.consumer;
+
+import org.dbsyncer.common.event.ChangedEvent;
+import org.dbsyncer.common.event.DDLChangedEvent;
+import org.dbsyncer.common.event.Watcher;
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.flush.impl.BufferActuatorRouter;
+import org.dbsyncer.parser.logger.LogService;
+import org.dbsyncer.parser.logger.LogType;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.TableGroup;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
+public abstract class AbstractConsumer<E extends ChangedEvent> implements Watcher {
+    private BufferActuatorRouter bufferActuatorRouter;
+    private ProfileComponent profileComponent;
+    private LogService logService;
+    private Meta meta;
+    protected Mapping mapping;
+    protected List<TableGroup> tableGroups;
+
+    public AbstractConsumer init(BufferActuatorRouter bufferActuatorRouter, ProfileComponent profileComponent, LogService logService, Meta meta, Mapping mapping, List<TableGroup> tableGroups) {
+        this.bufferActuatorRouter = bufferActuatorRouter;
+        this.profileComponent = profileComponent;
+        this.logService = logService;
+        this.meta = meta;
+        this.mapping = mapping;
+        this.tableGroups = tableGroups;
+        postProcessBeforeInitialization();
+        return this;
+    }
+
+    public abstract void postProcessBeforeInitialization();
+
+    public abstract void onChange(E e);
+
+    public void onDDLChanged(DDLChangedEvent event) {
+    }
+
+    @Override
+    public void changeEvent(ChangedEvent event) {
+        event.getChangedOffset().setMetaId(meta.getId());
+        if (event instanceof DDLChangedEvent) {
+            onDDLChanged((DDLChangedEvent) event);
+            return;
+        }
+        onChange((E) event);
+    }
+
+    @Override
+    public void flushEvent(Map<String, String> snapshot) {
+        meta.setSnapshot(snapshot);
+        profileComponent.editConfigModel(meta);
+    }
+
+    @Override
+    public void errorEvent(Exception e) {
+        logService.log(LogType.TableGroupLog.INCREMENT_FAILED, e.getMessage());
+    }
+
+    @Override
+    public long getMetaUpdateTime() {
+        return meta.getUpdateTime();
+    }
+
+    protected void bind(String tableGroupId) {
+        bufferActuatorRouter.bind(meta.getId(), tableGroupId);
+    }
+
+    protected void execute(String tableGroupId, ChangedEvent event) {
+        bufferActuatorRouter.execute(meta.getId(), tableGroupId, event);
+    }
+}

+ 87 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/impl/LogConsumer.java

@@ -0,0 +1,87 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.consumer.impl;
+
+import org.dbsyncer.common.event.CommonChangedEvent;
+import org.dbsyncer.common.event.DDLChangedEvent;
+import org.dbsyncer.common.event.RowChangedEvent;
+import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.connector.model.Table;
+import org.dbsyncer.parser.consumer.AbstractConsumer;
+import org.dbsyncer.parser.model.FieldPicker;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.util.PickerUtil;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * 日志消费
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 02:25
+ */
+public final class LogConsumer extends AbstractConsumer<RowChangedEvent> {
+    private Map<String, List<FieldPicker>> tablePicker = new LinkedHashMap<>();
+
+    //判断上次是否为ddl,是ddl需要强制刷新下picker
+    private boolean ddlChanged;
+
+    @Override
+    public void postProcessBeforeInitialization() {
+        addTablePicker(true);
+    }
+
+    @Override
+    public void onChange(RowChangedEvent event) {
+        // 需要强制刷新 fix https://gitee.com/ghi/dbsyncer/issues/I8DJUR
+        if (ddlChanged) {
+            addTablePicker(false);
+            ddlChanged = false;
+        }
+        process(event, picker -> {
+            final Map<String, Object> changedRow = picker.getColumns(event.getDataList());
+            if (picker.filter(changedRow)) {
+                event.setChangedRow(changedRow);
+                execute(picker.getTableGroup().getId(), event);
+            }
+        });
+    }
+
+    @Override
+    public void onDDLChanged(DDLChangedEvent event) {
+        ddlChanged = true;
+        process(event, picker -> execute(picker.getTableGroup().getId(), event));
+    }
+
+    private void process(CommonChangedEvent event, Consumer<FieldPicker> consumer) {
+        // 处理过程有异常向上抛
+        List<FieldPicker> pickers = tablePicker.get(event.getSourceTableName());
+        if (!CollectionUtils.isEmpty(pickers)) {
+            // 触发刷新增量点事件
+            event.getChangedOffset().setRefreshOffset(true);
+            pickers.forEach(picker -> consumer.accept(picker));
+        }
+    }
+
+    private void addTablePicker(boolean bindBufferActuatorRouter) {
+        this.tablePicker.clear();
+        this.tableGroups.forEach(t -> {
+            final Table table = t.getSourceTable();
+            final String tableName = table.getName();
+            tablePicker.putIfAbsent(tableName, new ArrayList<>());
+            TableGroup group = PickerUtil.mergeTableGroupConfig(mapping, t);
+            tablePicker.get(tableName).add(new FieldPicker(group, group.getFilter(), table.getColumn(), group.getFieldMapping()));
+            // 是否注册到路由服务中
+            if (bindBufferActuatorRouter) {
+                bind(group.getId());
+            }
+        });
+    }
+
+}

+ 42 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/consumer/impl/QuartzConsumer.java

@@ -0,0 +1,42 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.consumer.impl;
+
+import org.dbsyncer.common.event.ScanChangedEvent;
+import org.dbsyncer.parser.consumer.AbstractConsumer;
+import org.dbsyncer.parser.model.FieldPicker;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.util.PickerUtil;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 定时消费
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 02:18
+ */
+public final class QuartzConsumer extends AbstractConsumer<ScanChangedEvent> {
+    private List<FieldPicker> tablePicker = new LinkedList<>();
+
+    @Override
+    public void postProcessBeforeInitialization() {
+        tableGroups.forEach(t -> {
+            tablePicker.add(new FieldPicker(PickerUtil.mergeTableGroupConfig(mapping, t)));
+            bind(t.getId());
+        });
+    }
+
+    @Override
+    public void onChange(ScanChangedEvent event) {
+        final FieldPicker picker = tablePicker.get(event.getTableGroupIndex());
+        TableGroup tableGroup = picker.getTableGroup();
+        event.setSourceTableName(tableGroup.getSourceTable().getName());
+
+        // 定时暂不支持触发刷新增量点事件
+        execute(tableGroup.getId(), event);
+    }
+}

+ 7 - 4
dbsyncer-manager/src/main/java/org/dbsyncer/manager/enums/CommandEnum.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/enums/CommandEnum.java

@@ -1,8 +1,11 @@
-package org.dbsyncer.manager.enums;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.enums;
 
-import org.dbsyncer.manager.CommandExecutor;
-import org.dbsyncer.manager.command.Persistence;
-import org.dbsyncer.manager.command.Preload;
+import org.dbsyncer.parser.command.CommandExecutor;
+import org.dbsyncer.parser.command.Persistence;
+import org.dbsyncer.parser.command.Preload;
 import org.dbsyncer.storage.constant.ConfigConstant;
 
 /**

+ 8 - 5
dbsyncer-manager/src/main/java/org/dbsyncer/manager/enums/GroupStrategyEnum.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/enums/GroupStrategyEnum.java

@@ -1,9 +1,12 @@
-package org.dbsyncer.manager.enums;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.enums;
 
-import org.dbsyncer.manager.GroupStrategy;
-import org.dbsyncer.manager.strategy.DefaultGroupStrategy;
-import org.dbsyncer.manager.strategy.PreloadTableGroupStrategy;
-import org.dbsyncer.manager.strategy.TableGroupStrategy;
+import org.dbsyncer.parser.strategy.GroupStrategy;
+import org.dbsyncer.parser.strategy.impl.DefaultGroupStrategy;
+import org.dbsyncer.parser.strategy.impl.PreloadTableGroupStrategy;
+import org.dbsyncer.parser.strategy.impl.TableGroupStrategy;
 
 /**
  * @author AE86

+ 14 - 5
dbsyncer-manager/src/main/java/org/dbsyncer/manager/puller/BufferActuatorRouter.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/BufferActuatorRouter.java

@@ -1,9 +1,11 @@
-package org.dbsyncer.manager.puller;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.flush.impl;
 
 import org.dbsyncer.common.config.TableGroupBufferConfig;
 import org.dbsyncer.common.event.ChangedEvent;
-import org.dbsyncer.parser.Parser;
-import org.dbsyncer.parser.flush.impl.TableGroupBufferActuator;
+import org.dbsyncer.parser.flush.BufferActuator;
 import org.dbsyncer.parser.model.WriterRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -16,6 +18,13 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
+/**
+ * 缓存执行器路由
+ *
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-12 01:32
+ */
 @Component
 public final class BufferActuatorRouter implements DisposableBean {
 
@@ -28,7 +37,7 @@ public final class BufferActuatorRouter implements DisposableBean {
     private TableGroupBufferActuator tableGroupBufferActuator;
 
     @Resource
-    private Parser parser;
+    private BufferActuator generalBufferActuator;
 
     /**
      * 驱动缓存执行路由列表
@@ -40,7 +49,7 @@ public final class BufferActuatorRouter implements DisposableBean {
             router.get(metaId).get(tableGroupId).offer(new WriterRequest(tableGroupId, event));
             return;
         }
-        parser.execute(tableGroupId, event);
+        generalBufferActuator.offer(new WriterRequest(tableGroupId, event));
     }
 
     public void bind(String metaId, String tableGroupId) {

+ 6 - 6
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/GeneralBufferActuator.java

@@ -14,7 +14,7 @@ import org.dbsyncer.connector.config.DDLConfig;
 import org.dbsyncer.connector.constant.ConnectorConstant;
 import org.dbsyncer.connector.enums.ConnectorEnum;
 import org.dbsyncer.connector.model.MetaInfo;
-import org.dbsyncer.parser.Parser;
+import org.dbsyncer.parser.ParserComponent;
 import org.dbsyncer.parser.ddl.DDLParser;
 import org.dbsyncer.parser.flush.AbstractBufferActuator;
 import org.dbsyncer.parser.model.BatchWriter;
@@ -68,7 +68,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
     private ConnectorFactory connectorFactory;
 
     @Resource
-    private Parser parser;
+    private ParserComponent parserComponent;
 
     @Resource
     private PluginFactory pluginFactory;
@@ -154,7 +154,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
 
         // 5、批量执行同步
         BatchWriter batchWriter = new BatchWriter(tConnectorMapper, group.getCommand(), targetTableName, event, picker.getTargetFields(), targetDataList, generalBufferConfig.getBufferWriterCount());
-        Result result = parser.writeBatch(context, batchWriter, generalExecutor);
+        Result result = parserComponent.writeBatch(context, batchWriter, generalExecutor);
 
         // 6.发布刷新增量点事件
         applicationContext.publishEvent(new RefreshOffsetEvent(applicationContext, response.getOffsetList()));
@@ -202,8 +202,8 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
                 result.setTargetTableGroupName(targetTableName);
 
                 // 2.获取目标表最新的属性字段
-                MetaInfo targetMetaInfo = parser.getMetaInfo(mapping.getTargetConnectorId(), targetTableName);
-                MetaInfo originMetaInfo = parser.getMetaInfo(mapping.getSourceConnectorId(), tableGroup.getSourceTable().getName());
+                MetaInfo targetMetaInfo = parserComponent.getMetaInfo(mapping.getTargetConnectorId(), targetTableName);
+                MetaInfo originMetaInfo = parserComponent.getMetaInfo(mapping.getSourceConnectorId(), tableGroup.getSourceTable().getName());
 
                 // 3.更新表字段映射(根据保留的更改的属性,进行更改)
                 tableGroup.getSourceTable().setColumn(originMetaInfo.getColumn());
@@ -211,7 +211,7 @@ public class GeneralBufferActuator extends AbstractBufferActuator<WriterRequest,
                 tableGroup.setFieldMapping(ddlParser.refreshFiledMappings(originalFieldMappings, originMetaInfo, targetMetaInfo, targetDDLConfig));
 
                 // 4.更新执行命令
-                Map<String, String> commands = parser.getCommand(mapping, tableGroup);
+                Map<String, String> commands = parserComponent.getCommand(mapping, tableGroup);
                 tableGroup.setCommand(commands);
 
                 // 5.持久化存储 & 更新缓存配置

+ 8 - 116
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserFactory.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ParserComponentImpl.java

@@ -1,6 +1,5 @@
-package org.dbsyncer.parser;
+package org.dbsyncer.parser.impl;
 
-import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.event.ChangedEvent;
 import org.dbsyncer.common.model.AbstractConnectorConfig;
 import org.dbsyncer.common.model.FullConvertContext;
@@ -8,26 +7,20 @@ import org.dbsyncer.common.model.Result;
 import org.dbsyncer.common.spi.ConnectorMapper;
 import org.dbsyncer.common.spi.ConvertContext;
 import org.dbsyncer.common.util.CollectionUtils;
-import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.connector.ConnectorFactory;
 import org.dbsyncer.connector.config.CommandConfig;
 import org.dbsyncer.connector.config.ReaderConfig;
 import org.dbsyncer.connector.config.WriterBatchConfig;
 import org.dbsyncer.connector.constant.ConnectorConstant;
-import org.dbsyncer.connector.enums.ConnectorEnum;
-import org.dbsyncer.connector.enums.FilterEnum;
-import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.MetaInfo;
 import org.dbsyncer.connector.model.Table;
 import org.dbsyncer.connector.util.PrimaryKeyUtil;
-import org.dbsyncer.listener.enums.QuartzFilterEnum;
-import org.dbsyncer.parser.enums.ConvertEnum;
+import org.dbsyncer.parser.ParserComponent;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.event.FullRefreshEvent;
 import org.dbsyncer.parser.flush.BufferActuator;
-import org.dbsyncer.parser.logger.LogService;
-import org.dbsyncer.parser.logger.LogType;
 import org.dbsyncer.parser.model.BatchWriter;
 import org.dbsyncer.parser.model.Connector;
 import org.dbsyncer.parser.model.FieldMapping;
@@ -40,7 +33,6 @@ import org.dbsyncer.parser.strategy.FlushStrategy;
 import org.dbsyncer.parser.util.ConvertUtil;
 import org.dbsyncer.parser.util.PickerUtil;
 import org.dbsyncer.plugin.PluginFactory;
-import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
@@ -50,7 +42,6 @@ import org.springframework.util.Assert;
 import javax.annotation.Resource;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
@@ -62,7 +53,7 @@ import java.util.concurrent.Executor;
  * @date 2019/9/29 22:38
  */
 @Component
-public class ParserFactory implements Parser {
+public class ParserComponentImpl implements ParserComponent {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
@@ -73,13 +64,10 @@ public class ParserFactory implements Parser {
     private PluginFactory pluginFactory;
 
     @Resource
-    private CacheService cacheService;
-
-    @Resource
-    private LogService logService;
+    private FlushStrategy flushStrategy;
 
     @Resource
-    private FlushStrategy flushStrategy;
+    private ProfileComponent profileComponent;
 
     @Resource
     private ApplicationContext applicationContext;
@@ -87,39 +75,6 @@ public class ParserFactory implements Parser {
     @Resource
     private BufferActuator generalBufferActuator;
 
-    @Override
-    public ConnectorMapper connect(AbstractConnectorConfig config) {
-        return connectorFactory.connect(config);
-    }
-
-    @Override
-    public boolean refreshConnectorConfig(AbstractConnectorConfig config) {
-        return connectorFactory.refresh(config);
-    }
-
-    @Override
-    public boolean isAliveConnectorConfig(AbstractConnectorConfig config) {
-        boolean alive = false;
-        try {
-            alive = connectorFactory.isAlive(config);
-        } catch (Exception e) {
-            LogType.ConnectorLog logType = LogType.ConnectorLog.FAILED;
-            logService.log(logType, "%s%s", logType.getName(), e.getMessage());
-        }
-        // 断线重连
-        if (!alive) {
-            try {
-                alive = connectorFactory.refresh(config);
-            } catch (Exception e) {
-                logger.error(e.getMessage());
-            }
-            if (alive) {
-                logger.info(LogType.ConnectorLog.RECONNECT_SUCCESS.getMessage());
-            }
-        }
-        return alive;
-    }
-
     @Override
     public List<Table> getTable(ConnectorMapper config) {
         return connectorFactory.getTable(config);
@@ -127,7 +82,7 @@ public class ParserFactory implements Parser {
 
     @Override
     public MetaInfo getMetaInfo(String connectorId, String tableName) {
-        Connector connector = getConnector(connectorId);
+        Connector connector = profileComponent.getConnector(connectorId);
         ConnectorMapper connectorMapper = connectorFactory.connect(connector.getConfig());
         MetaInfo metaInfo = connectorFactory.getMetaInfo(connectorMapper, tableName);
         if (!CollectionUtils.isEmpty(connector.getTable())) {
@@ -174,56 +129,6 @@ public class ParserFactory implements Parser {
         return connectorFactory.getCount(connectorMapper, command);
     }
 
-    @Override
-    public Connector parseConnector(String json) {
-        Map conn = JsonUtil.parseMap(json);
-        Map config = (Map) conn.remove("config");
-        Connector connector = JsonUtil.jsonToObj(conn.toString(), Connector.class);
-        Assert.notNull(connector, "Connector can not be null.");
-        String connectorType = (String) config.get("connectorType");
-        ConnectorEnum connectorEnum = ConnectorEnum.getConnectorEnum(connectorType);
-        AbstractConnectorConfig obj = JsonUtil.jsonToObj(config.toString(), connectorEnum.getConfigClass());
-        obj.setConnectorType(connectorEnum.getType());
-        connector.setConfig(obj);
-
-        return connector;
-    }
-
-    @Override
-    public <T> T parseObject(String json, Class<T> clazz) {
-        return JsonUtil.jsonToObj(json, clazz);
-    }
-
-    @Override
-    public List<ConnectorEnum> getConnectorEnumAll() {
-        return Arrays.asList(ConnectorEnum.values());
-    }
-
-    @Override
-    public List<OperationEnum> getOperationEnumAll() {
-        return Arrays.asList(OperationEnum.values());
-    }
-
-    @Override
-    public List<QuartzFilterEnum> getQuartzFilterEnumAll() {
-        return Arrays.asList(QuartzFilterEnum.values());
-    }
-
-    @Override
-    public List<FilterEnum> getFilterEnumAll() {
-        return Arrays.asList(FilterEnum.values());
-    }
-
-    @Override
-    public List<ConvertEnum> getConvertEnumAll() {
-        return Arrays.asList(ConvertEnum.values());
-    }
-
-    @Override
-    public List<StorageDataStatusEnum> getStorageDataStatusEnumAll() {
-        return Arrays.asList(StorageDataStatusEnum.values());
-    }
-
     @Override
     public void execute(Task task, Mapping mapping, TableGroup tableGroup, Executor executor) {
         final String metaId = task.getId();
@@ -380,19 +285,6 @@ public class ParserFactory implements Parser {
         applicationContext.publishEvent(new FullRefreshEvent(applicationContext, task));
     }
 
-    /**
-     * 获取连接器
-     *
-     * @param connectorId
-     * @return
-     */
-    private Connector getConnector(String connectorId) {
-        Assert.hasText(connectorId, "Connector id can not be empty.");
-        Connector conn = cacheService.get(connectorId, Connector.class);
-        Assert.notNull(conn, "Connector can not be null.");
-        return conn;
-    }
-
     /**
      * 获取连接配置
      *
@@ -400,7 +292,7 @@ public class ParserFactory implements Parser {
      * @return
      */
     private AbstractConnectorConfig getConnectorConfig(String connectorId) {
-        return getConnector(connectorId).getConfig();
+        return profileComponent.getConnector(connectorId).getConfig();
     }
 
 }

+ 208 - 0
dbsyncer-parser/src/main/java/org/dbsyncer/parser/impl/ProfileComponentImpl.java

@@ -0,0 +1,208 @@
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.impl;
+
+import org.dbsyncer.common.model.AbstractConnectorConfig;
+import org.dbsyncer.common.util.CollectionUtils;
+import org.dbsyncer.common.util.JsonUtil;
+import org.dbsyncer.connector.enums.ConnectorEnum;
+import org.dbsyncer.connector.enums.FilterEnum;
+import org.dbsyncer.connector.enums.OperationEnum;
+import org.dbsyncer.listener.enums.QuartzFilterEnum;
+import org.dbsyncer.parser.ProfileComponent;
+import org.dbsyncer.parser.enums.CommandEnum;
+import org.dbsyncer.parser.enums.ConvertEnum;
+import org.dbsyncer.parser.enums.GroupStrategyEnum;
+import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.model.Connector;
+import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.OperationConfig;
+import org.dbsyncer.parser.model.ProjectGroup;
+import org.dbsyncer.parser.model.QueryConfig;
+import org.dbsyncer.parser.model.SystemConfig;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.model.UserConfig;
+import org.dbsyncer.parser.template.OperationTemplate;
+import org.dbsyncer.storage.enums.StorageDataStatusEnum;
+import org.springframework.stereotype.Component;
+import org.springframework.util.Assert;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Version 1.0.0
+ * @Author AE86
+ * @Date 2023-11-13 21:16
+ */
+@Component
+public class ProfileComponentImpl implements ProfileComponent {
+
+    @Resource
+    private OperationTemplate operationTemplate;
+
+    @Override
+    public Connector parseConnector(String json) {
+        Map conn = JsonUtil.parseMap(json);
+        Map config = (Map) conn.remove("config");
+        Connector connector = JsonUtil.jsonToObj(conn.toString(), Connector.class);
+        Assert.notNull(connector, "Connector can not be null.");
+        String connectorType = (String) config.get("connectorType");
+        ConnectorEnum connectorEnum = ConnectorEnum.getConnectorEnum(connectorType);
+        AbstractConnectorConfig obj = JsonUtil.jsonToObj(config.toString(), connectorEnum.getConfigClass());
+        obj.setConnectorType(connectorEnum.getType());
+        connector.setConfig(obj);
+
+        return connector;
+    }
+
+    @Override
+    public <T> T parseObject(String json, Class<T> clazz) {
+        return JsonUtil.jsonToObj(json, clazz);
+    }
+
+    @Override
+    public String addConfigModel(ConfigModel model) {
+        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD));
+    }
+
+    @Override
+    public String editConfigModel(ConfigModel model) {
+        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_EDIT));
+    }
+
+    @Override
+    public void removeConfigModel(String id) {
+        operationTemplate.remove(new OperationConfig(id));
+    }
+
+    @Override
+    public SystemConfig getSystemConfig() {
+        List<SystemConfig> list = operationTemplate.queryAll(SystemConfig.class);
+        return CollectionUtils.isEmpty(list) ? null : list.get(0);
+    }
+
+    @Override
+    public UserConfig getUserConfig() {
+        List<UserConfig> list = operationTemplate.queryAll(UserConfig.class);
+        return CollectionUtils.isEmpty(list) ? null : list.get(0);
+    }
+
+    @Override
+    public ProjectGroup getProjectGroup(String id) {
+        return operationTemplate.queryObject(ProjectGroup.class, id);
+    }
+
+    @Override
+    public List<ProjectGroup> getProjectGroupAll() {
+        return operationTemplate.queryAll(ProjectGroup.class);
+    }
+
+    @Override
+    public Connector getConnector(String connectorId) {
+        return operationTemplate.queryObject(Connector.class, connectorId);
+    }
+
+    @Override
+    public List<Connector> getConnectorAll() {
+        return operationTemplate.queryAll(Connector.class);
+    }
+
+    @Override
+    public Mapping getMapping(String mappingId) {
+        return operationTemplate.queryObject(Mapping.class, mappingId);
+    }
+
+    @Override
+    public List<Mapping> getMappingAll() {
+        return operationTemplate.queryAll(Mapping.class);
+    }
+
+    @Override
+    public String addTableGroup(TableGroup model) {
+        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_ADD, GroupStrategyEnum.TABLE));
+    }
+
+    @Override
+    public String editTableGroup(TableGroup model) {
+        return operationTemplate.execute(new OperationConfig(model, CommandEnum.OPR_EDIT, GroupStrategyEnum.TABLE));
+    }
+
+    @Override
+    public void removeTableGroup(String id) {
+        operationTemplate.remove(new OperationConfig(id, GroupStrategyEnum.TABLE));
+    }
+
+    @Override
+    public TableGroup getTableGroup(String tableGroupId) {
+        return operationTemplate.queryObject(TableGroup.class, tableGroupId);
+    }
+
+    @Override
+    public List<TableGroup> getTableGroupAll(String mappingId) {
+        TableGroup tableGroup = new TableGroup().setMappingId(mappingId);
+        return operationTemplate.queryAll(new QueryConfig(tableGroup, GroupStrategyEnum.TABLE));
+    }
+
+    @Override
+    public List<TableGroup> getSortedTableGroupAll(String mappingId) {
+        List<TableGroup> list = getTableGroupAll(mappingId)
+                .stream()
+                .sorted(Comparator.comparing(TableGroup::getIndex).reversed())
+                .collect(Collectors.toList());
+        return list;
+    }
+
+    @Override
+    public int getTableGroupCount(String mappingId) {
+        TableGroup tableGroup = new TableGroup().setMappingId(mappingId);
+        return operationTemplate.queryCount(new QueryConfig<>(tableGroup, GroupStrategyEnum.TABLE));
+    }
+
+    @Override
+    public Meta getMeta(String metaId) {
+        return operationTemplate.queryObject(Meta.class, metaId);
+    }
+
+    @Override
+    public List<Meta> getMetaAll() {
+        return operationTemplate.queryAll(Meta.class);
+    }
+
+    @Override
+    public List<ConnectorEnum> getConnectorEnumAll() {
+        return Arrays.asList(ConnectorEnum.values());
+    }
+
+    @Override
+    public List<OperationEnum> getOperationEnumAll() {
+        return Arrays.asList(OperationEnum.values());
+    }
+
+    @Override
+    public List<QuartzFilterEnum> getQuartzFilterEnumAll() {
+        return Arrays.asList(QuartzFilterEnum.values());
+    }
+
+    @Override
+    public List<FilterEnum> getFilterEnumAll() {
+        return Arrays.asList(FilterEnum.values());
+    }
+
+    @Override
+    public List<ConvertEnum> getConvertEnumAll() {
+        return Arrays.asList(ConvertEnum.values());
+    }
+
+    @Override
+    public List<StorageDataStatusEnum> getStorageDataStatusEnumAll() {
+        return Arrays.asList(StorageDataStatusEnum.values());
+    }
+
+}

+ 9 - 50
dbsyncer-parser/src/main/java/org/dbsyncer/parser/message/MessageServiceImpl.java

@@ -1,42 +1,30 @@
 package org.dbsyncer.parser.message;
 
-import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.model.NotifyMessage;
-import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.spi.NotifyService;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.parser.Parser;
+import org.dbsyncer.parser.ProfileComponent;
 import org.dbsyncer.parser.model.UserConfig;
-import org.dbsyncer.storage.StorageService;
-import org.dbsyncer.storage.constant.ConfigConstant;
-import org.dbsyncer.storage.enums.StorageEnum;
-import org.dbsyncer.storage.query.Query;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.*;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 @Component
 public class MessageServiceImpl implements MessageService {
 
-    private String userConfigId;
-
-    @Autowired
-    private CacheService cacheService;
-
-    @Autowired
+    @Resource
     private NotifyService notifyService;
 
-    @Autowired
-    private StorageService storageService;
-
-    @Autowired
-    private Parser parser;
+    @Resource
+    private ProfileComponent profileComponent;
 
     @Override
     public void sendMessage(String title, String content) {
-        UserConfig userConfig = getUserConfig();
+        UserConfig userConfig = profileComponent.getUserConfig();
         if (null == userConfig) {
             return;
         }
@@ -53,33 +41,4 @@ public class MessageServiceImpl implements MessageService {
         notifyService.sendMessage(NotifyMessage.newBuilder().setTitle(title).setContent(content).setReceivers(mails));
     }
 
-    private UserConfig getUserConfig() {
-        if (StringUtil.isNotBlank(userConfigId)) {
-            return cacheService.get(userConfigId, UserConfig.class);
-        }
-
-        UserConfig userConfig = null;
-        synchronized (this) {
-            Query query = new Query();
-            query.setType(StorageEnum.CONFIG);
-            query.addFilter(ConfigConstant.CONFIG_MODEL_TYPE, ConfigConstant.USER);
-            query.setPageNum(1);
-            query.setPageSize(1);
-            Paging paging = storageService.query(query);
-            List<Map> data = (List<Map>) paging.getData();
-            if (!CollectionUtils.isEmpty(data)) {
-                Iterator iterator = data.iterator();
-                if (iterator.hasNext()) {
-                    Map map = (Map) iterator.next();
-                    String json = (String) map.get(ConfigConstant.CONFIG_MODEL_JSON);
-                    userConfig = parser.parseObject(json, UserConfig.class);
-                    userConfigId = userConfig.getId();
-                }
-
-            }
-
-        }
-        return userConfig;
-    }
-
 }

+ 9 - 4
dbsyncer-manager/src/main/java/org/dbsyncer/manager/model/FieldPicker.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/FieldPicker.java

@@ -1,4 +1,7 @@
-package org.dbsyncer.manager.model;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.model;
 
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.DateFormatUtil;
@@ -8,13 +11,15 @@ import org.dbsyncer.connector.enums.FilterEnum;
 import org.dbsyncer.connector.enums.OperationEnum;
 import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.connector.model.Filter;
-import org.dbsyncer.parser.model.FieldMapping;
-import org.dbsyncer.parser.model.TableGroup;
 import org.springframework.util.Assert;
 
 import java.sql.Date;
 import java.sql.Timestamp;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class FieldPicker {

+ 6 - 4
dbsyncer-manager/src/main/java/org/dbsyncer/manager/model/OperationConfig.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/OperationConfig.java

@@ -1,8 +1,10 @@
-package org.dbsyncer.manager.model;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.model;
 
-import org.dbsyncer.manager.enums.CommandEnum;
-import org.dbsyncer.manager.enums.GroupStrategyEnum;
-import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.enums.CommandEnum;
+import org.dbsyncer.parser.enums.GroupStrategyEnum;
 
 public class OperationConfig {
 

+ 5 - 3
dbsyncer-manager/src/main/java/org/dbsyncer/manager/model/QueryConfig.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/model/QueryConfig.java

@@ -1,7 +1,9 @@
-package org.dbsyncer.manager.model;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.model;
 
-import org.dbsyncer.manager.enums.GroupStrategyEnum;
-import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.enums.GroupStrategyEnum;
 
 public class QueryConfig<T> {
 

+ 4 - 1
dbsyncer-manager/src/main/java/org/dbsyncer/manager/GroupStrategy.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/GroupStrategy.java

@@ -1,4 +1,7 @@
-package org.dbsyncer.manager;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.strategy;
 
 import org.dbsyncer.parser.model.ConfigModel;
 

+ 5 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/strategy/DefaultGroupStrategy.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/DefaultGroupStrategy.java

@@ -1,7 +1,10 @@
-package org.dbsyncer.manager.strategy;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.strategy.impl;
 
-import org.dbsyncer.manager.GroupStrategy;
 import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.strategy.GroupStrategy;
 
 /**
  * @author AE86

+ 5 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/strategy/PreloadTableGroupStrategy.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/PreloadTableGroupStrategy.java

@@ -1,7 +1,10 @@
-package org.dbsyncer.manager.strategy;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.strategy.impl;
 
-import org.dbsyncer.manager.GroupStrategy;
 import org.dbsyncer.parser.model.Mapping;
+import org.dbsyncer.parser.strategy.GroupStrategy;
 import org.dbsyncer.storage.constant.ConfigConstant;
 
 /**

+ 5 - 2
dbsyncer-manager/src/main/java/org/dbsyncer/manager/strategy/TableGroupStrategy.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/TableGroupStrategy.java

@@ -1,7 +1,10 @@
-package org.dbsyncer.manager.strategy;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.strategy.impl;
 
-import org.dbsyncer.manager.GroupStrategy;
 import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.parser.strategy.GroupStrategy;
 import org.dbsyncer.storage.constant.ConfigConstant;
 
 /**

+ 23 - 16
dbsyncer-manager/src/main/java/org/dbsyncer/manager/template/OperationTemplate.java → dbsyncer-parser/src/main/java/org/dbsyncer/parser/template/OperationTemplate.java

@@ -1,27 +1,34 @@
-package org.dbsyncer.manager.template;
+/**
+ * DBSyncer Copyright 2020-2023 All Rights Reserved.
+ */
+package org.dbsyncer.parser.template;
 
 import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.StringUtil;
-import org.dbsyncer.manager.GroupStrategy;
-import org.dbsyncer.manager.ManagerException;
-import org.dbsyncer.manager.command.PersistenceCommand;
-import org.dbsyncer.manager.enums.CommandEnum;
-import org.dbsyncer.manager.enums.GroupStrategyEnum;
-import org.dbsyncer.manager.model.OperationConfig;
-import org.dbsyncer.manager.model.QueryConfig;
+import org.dbsyncer.parser.ParserException;
+import org.dbsyncer.parser.command.PersistenceCommand;
+import org.dbsyncer.parser.enums.CommandEnum;
+import org.dbsyncer.parser.enums.GroupStrategyEnum;
 import org.dbsyncer.parser.model.ConfigModel;
+import org.dbsyncer.parser.model.OperationConfig;
+import org.dbsyncer.parser.model.QueryConfig;
+import org.dbsyncer.parser.strategy.GroupStrategy;
 import org.dbsyncer.parser.util.ConfigModelUtil;
 import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
-import java.util.*;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 操作配置模板
@@ -35,10 +42,10 @@ public final class OperationTemplate {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    @Autowired
+    @Resource
     private StorageService storageService;
 
-    @Autowired
+    @Resource
     private CacheService cacheService;
 
     public <T> List<T> queryAll(Class<T> valueType) {
@@ -46,7 +53,7 @@ public final class OperationTemplate {
             ConfigModel configModel = (ConfigModel) valueType.newInstance();
             return queryAll(new QueryConfig<T>(configModel));
         } catch (Exception e) {
-            throw new ManagerException(e);
+            throw new ParserException(e);
         }
     }
 
@@ -154,13 +161,13 @@ public final class OperationTemplate {
             BeanUtils.copyProperties(o, t);
             return t;
         } catch (InstantiationException e) {
-            throw new ManagerException(e.getMessage());
+            throw new ParserException(e);
         } catch (IllegalAccessException e) {
-            throw new ManagerException(e.getMessage());
+            throw new ParserException(e);
         }
     }
 
-    class Group {
+    public class Group {
 
         private List<String> index;