> 插件有什么用？

> 插件是一种可扩展全量同步和增量同步实现数据转换的技术方式。通过插件可以接收同步数据，自定义同步到目标源的行数据，也能消费数据并实现更多业务场景。

如何开发插件？

1. 新建java或maven工程，或者下载 示例项目
2. 导入开发包：
   - 方式1：导入jar

     dbsyncer-common-[[${version}]].jar

     dbsyncer-connector-[[${version}]].jar (非必须)

   - 方式2：引入pom（需要安装到本地）

         <dependency>
           <groupId>org.ghi</groupId>
           <artifactId>dbsyncer-common</artifactId>
           <version>[[${version}]]</version>
         </dependency>
         <dependency>
           <groupId>org.ghi</groupId>
           <artifactId>dbsyncer-connector</artifactId>
           <version>[[${version}]]</version>
         </dependency>

3. 新建一个类，比如MyPlugin，实现接口ConvertService方法

       package org.test;

       import org.dbsyncer.common.spi.ConvertContext;
       import org.dbsyncer.common.spi.ConvertService;

       public class MyPlugin implements ConvertService {

           /**
            * 全量同步/增量同步
            *
            * @param convertContext
            */
           @Override
           public void convert(ConvertContext convertContext) {
               // TODO 消费或处理数据
               System.out.println("插件消费数据中...");

               // 是否终止同步到目标库开关，默认false
               convertContext.setTerminated(false);

               // 获取Spring上下文，当然也可获取dbs注册的bean对象
               convertContext.getContext();

               // 数据源表和目标源表
               convertContext.getSourceTableName();
               convertContext.getTargetTableName();

               // 捕获的事件（INSERT/UPDATE/DELETE）
               convertContext.getEvent();

               // 数据源和目标源表全量或增量数据
               convertContext.getSourceList();
               convertContext.getTargetList();

               // 获取目标库连接器实例（如果需要用到连接器，必须引入dbsyncer-connector-[[${version}]].jar）
               convertContext.getTargetConnectorMapper();
           }

           /**
            * 全量同步/增量同步完成后执行处理
            *
            * @param context
            */
           @Override
           public void postProcessAfter(ConvertContext context) {
               // 完成同步后调用该方法
              logger.info("插件正在处理同步成功的数据，目标源表:{}，事件:{}，条数:{}", context.getTargetTableName(), context.getEvent(), context.getTargetList().size());

               ConnectorMapper connectorMapper = context.getSourceConnectorMapper();

               // 获取关系型数据库连接，实现自己的业务逻辑...
               if (connectorMapper instanceof DatabaseConnectorMapper) {
                   DatabaseConnectorMapper db = (DatabaseConnectorMapper) connectorMapper;
                   // 方式一（推荐）：
                   String query = "select * from my_user";
                   db.execute(databaseTemplate -> databaseTemplate.queryForList(query));

                   // 方式二：
                   SimpleConnection connection = null;
                   try {
                       // 通过JDBC访问数据库
                       connection = (SimpleConnection) db.getConnection();
                   } catch (Exception e) {
                       e.printStackTrace();
                   } finally {
                       if(connection != null){
                           connection.close();
                       }
                   }
               }
           }

           /**
            * 重写方法：设置版本号
            *
            * @return
            */
           @Override
           public String getVersion() {
               return "1.0.0";
           }

           /**
            * 重写方法：设置插件名称
            *
            * @return
            */
           @Override
           public String getName() {
               return "我的插件";
           }
       }

4. /META-INF/新建services文件夹，并在services下新建一个文件，命名为org.dbsyncer.common.spi.ConvertService，文件写入实现类路径org.test.MyPlugin，如果有多个实现就换行再写入

5. 打包jar

### 上传插件 只支持 "jar" 的文件扩展名.

插件列表([[${plugins?.size()} ?: 0]])
名称 | 运行驱动 | 类名 | 版本 | 文件
--- | --- | --- | --- | ---
[[${p?.name}]] | [[${p?.name}]] |  |  |  |