AE86 il y a 4 ans
Parent
commit
19ee437a3e

+ 33 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/spi/ConvertService.java

@@ -0,0 +1,33 @@
+package org.dbsyncer.common.spi;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 插件扩展服务接口
+ * <p>全量同步/增量同步,扩展转换</p>
+ *
+ * @author AE86
+ * @version 1.0.0
+ * @date 2021/02/22 20:26
+ */
+public interface ConvertService {
+
+    /**
+     * 全量同步
+     *
+     * @param source 数据源
+     * @param target 目标源
+     */
+    void convert(List<Map<String, Object>> source, List<Map<String, Object>> target);
+
+    /**
+     * 增量同步
+     *
+     * @param event  事件(新增INSERT/修改UPDATE/删除DELETE)
+     * @param source 数据源
+     * @param target 目标源
+     */
+    void convert(String event, Map<String, Object> source, Map<String, Object> target);
+
+}

+ 22 - 4
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/PluginFactory.java

@@ -1,6 +1,7 @@
 package org.dbsyncer.plugin;
 
 import org.apache.commons.io.FileUtils;
+import org.dbsyncer.common.spi.ConvertService;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.plugin.config.Plugin;
 import org.slf4j.Logger;
@@ -12,6 +13,7 @@ import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * @author AE86
@@ -31,11 +33,17 @@ public class PluginFactory {
 
     private final List<Plugin> plugins = new LinkedList<>();
 
+    private final Map<String, ConvertService> service = new ConcurrentHashMap<>();
+
     public void loadPlugins() {
         plugins.clear();
+        service.clear();
         Collection<File> files = FileUtils.listFiles(new File(PLUGIN_PATH), new String[] {"jar"}, true);
         if (!CollectionUtils.isEmpty(files)) {
-            files.forEach(f -> plugins.add(new Plugin(f.getName(), f.getName())));
+            files.forEach(f -> {
+                plugins.add(new Plugin(f.getName(), f.getName()));
+                loadPlugin(f);
+            });
         }
         logger.info("PreLoad plugin:{}", plugins.size());
     }
@@ -49,14 +57,24 @@ public class PluginFactory {
     }
 
     public void convert(Plugin plugin, List<Map<String, Object>> source, List<Map<String, Object>> target) {
-        if (null != plugin) {
-            // TODO 插件转换
+        if (null != plugin && service.containsKey(plugin.getClassName())) {
+            service.get(plugin.getClassName()).convert(source, target);
         }
     }
 
     public void convert(Plugin plugin, String event, Map<String, Object> source, Map<String, Object> target) {
-        if (null != plugin) {
+        if (null != plugin && service.containsKey(plugin.getClassName())) {
+            service.get(plugin.getClassName()).convert(event, source, target);
         }
     }
 
+    /**
+     * SPI, 扫描jar扩展接口实现,注册为本地服务
+     *
+     * @param file
+     */
+    private void loadPlugin(File file) {
+        // TODO 加载扩展实现
+    }
+
 }

+ 12 - 0
dbsyncer-plugin/src/main/java/org/dbsyncer/plugin/config/Plugin.java

@@ -13,6 +13,9 @@ public class Plugin {
     // 插件实现
     private String className;
 
+    // 版本号
+    private String version = "1.0.0";
+
     public Plugin() {
     }
 
@@ -37,4 +40,13 @@ public class Plugin {
         this.className = className;
         return this;
     }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public Plugin setVersion(String version) {
+        this.version = version;
+        return this;
+    }
 }