插件有什么用?

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

如何开发插件?

  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

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