插件有什么用?
插件是一种可扩展全量同步和增量同步实现数据转换的技术方式。通过插件可以接收同步数据,自定义同步到目标源的行数据,也能消费数据并实现更多业务场景。
如何开发插件?
<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>
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 "我的插件";
}
}