JAVA整合FlinkCDC 监控数据库表变化
版本至少jdk8
maven
- <!-- https://mvnrepository.com/artifact/com.alibaba.ververica/flink-connector-mysql-cdc -->
- <dependency>
- <groupId>com.alibaba.ververica</groupId>
- <artifactId>flink-connector-mysql-cdc</artifactId>
- <version>1.1.1</version>
- </dependency>
SqlDwdDeserializationSchema.java
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.ververica.cdc.debezium.DebeziumDeserializationSchema;
- import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
- import org.apache.flink.api.common.typeinfo.TypeInformation;
- import org.apache.flink.util.Collector;
- import org.apache.kafka.connect.data.Field;
- import org.apache.kafka.connect.data.Struct;
- import org.apache.kafka.connect.source.SourceRecord;
- import java.util.List;
- /**
- * flinkCdc 数据结构解析成json
- * @author .
- */
- public class SqlDwdDeserializationSchema implements DebeziumDeserializationSchema<JSONObject> {
- private static final long serialVersionUID = -3168848963265670603L;
- @Override
- public void deserialize(SourceRecord record, Collector<JSONObject> out) throws Exception {
- Struct dataRecord = (Struct) record.value();
- Struct afterStruct = dataRecord.getStruct("after");
- Struct beforeStruct = dataRecord.getStruct("before");
- JSONObject operateJson = new JSONObject();
- //操作的sql字段json数据
- JSONObject sqlJson = new JSONObject();
- //操作类型
- String operate_type = "";
- List<Field> fieldsList = null;
- if (afterStruct != null && beforeStruct != null) {
- System.out.println("这是修改数据");
- operate_type = "update";
- fieldsList = afterStruct.schema().fields();
- for (Field field : fieldsList) {
- String fieldName = field.name();
- Object fieldValue = afterStruct.get(fieldName);
- sqlJson.put(fieldName, fieldValue);
- }
- } else if (afterStruct != null) {
- System.out.println("这是新增数据");
- operate_type = "insert";
- fieldsList = afterStruct.schema().fields();
- for (Field field : fieldsList) {
- String fieldName = field.name();
- Object fieldValue = afterStruct.get(fieldName);
- sqlJson.put(fieldName, fieldValue);
- }
- } else if (beforeStruct != null) {
- System.out.println("这是删除数据");
- operate_type = "delete";
- fieldsList = beforeStruct.schema().fields();
- for (Field field : fieldsList) {
- String fieldName = field.name();
- Object fieldValue = beforeStruct.get(fieldName);
- sqlJson.put(fieldName, fieldValue);
- }
- } else {
- System.out.println("error>>>>>>>>>你执行了啥?");
- }
- operateJson.put("sqlJson", sqlJson);
- Struct source = dataRecord.getStruct("source");
- //操作的数据库名
- String database = source.getString("db");
- //操作的表名
- String table = source.getString("table");
- //操作的时间戳(单位:毫秒)
- Object operate_ms = source.get("ts_ms");
- operateJson.put("database", database);
- operateJson.put("table", table);
- operateJson.put("operate_ms", operate_ms);
- operateJson.put("operate_type", operate_type);
- String topic = record.topic();
- System.out.println("topic = " + topic);
- /**
- * 主键字段,这里就只取一个主键 如果有多个 自行修改
- */
- Struct pk = (Struct) record.key();
- List<Field> pkFieldList = pk.schema().fields();
- if (pkFieldList != null && pkFieldList.size() > 0) {
- Field field = pkFieldList.get(0);
- //主键字段
- Object pkName = field.name();
- //主键字段的值
- Object pkValue = pk.get(field.name());
- operateJson.put("pk_filed", pkName);
- }
- out.collect(operateJson);
- }
- @Override
- public TypeInformation<JSONObject> getProducedType() {
- return BasicTypeInfo.of(JSONObject.class);
- }
- }
java代码
- import com.alibaba.fastjson.JSONObject;
- import com.alibaba.ververica.cdc.connectors.mysql.MySQLSource;
- import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
- import org.apache.flink.streaming.api.functions.source.SourceFunction;
- /**
- * @author 。
- */
- public class MySqlSourceExample {
- public static void main(String[] args) throws Exception {
- SourceFunction<JSONObject> mySqlSource = MySQLSource.<JSONObject>builder()
- .hostname("yourHostname")
- .port(yourPort)
- .databaseList("yourDatabaseName") // set captured database
- .tableList("yourDatabaseName.yourTableName") // set captured table
- .username("yourUsername")
- .password("yourPassword")
- .deserializer(new SqlDwdDeserializationSchema()) // converts SourceRecord to JSON String
- .build();
- StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
- // enable checkpoint
- env.enableCheckpointing(3000);
- env.addSource(mySqlSource).print();
- env.execute("Print MySQL Snapshot + Binlog");
- }
- }
JAVA整合FlinkCDC 监控数据库表变化的更多相关文章
- 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...
- Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)
Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子 时间:2012-11-20 17:54:02 Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...
- JAVA 自动生成对应数据库表的JPA代码工具
http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成 自动生成对应数据库表的 ...
- Thingworx新建Thing的数据库表变化
为了在Thingworx的基础上建立统一的可视化平台,并且对软件产品具有自主控制权,不依赖于Thingworx软件(防止因Thingworx的升级.Bug导致的自主扩展功能受制),所以最近在研究Thi ...
- SQL2008的数据更新跟踪测试 (监控数据表变化,可用于同步)
POC过程如下: 这里我们建立一个测试环境,模拟数据在 Insert , Update 和 Delete 情况下的跟踪效果.1 .测试脚本的准备,下面脚本建立一个新的数据库环境,并作相应的跟踪配置后向 ...
- sqlDependency监控数据库数据变化,自动通知
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 使用SqlDependency监听MSSQL数据库表变化通知
SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...
- canal 监控数据库表 快速使用
https://github.com/alibaba/canal 快速开始 https://github.com/alibaba/canal/wiki/QuickStart 注意 1. vim con ...
- springboot整合JPA创建数据库表失败
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table t_s ...
随机推荐
- DirectX12 3D 游戏开发与实战第十章内容(下)
仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...
- go搭建beego框架 go安装bee报错 github.com/derekparker/delve@v1.4.0: parsing go.mod:
go搭建beego框架 go安装bee报错 go使用beego框架的时候,需要安装bee,安装的时候遇到一些坑报错,这里跟大家分享一下,有助于快速安装bee,搭建好beego环境 1. 首先切换到go ...
- R语言与医学统计图形-【18】ggplot2几何对象汇总
ggplot2绘图系统--几何对象汇总 前面介绍了常见的几种基本的几何对象,并且介绍了scale.stat等其他要素.后续将介绍position.themes.coord和faceting等函数. 这 ...
- rust shadow
1 fn main() { 2 let mut demo = 12; 3 println!("{}",demo); 4 demo = 21; // 值可变,数据类型不可变 5 pr ...
- mysql 不等于 符号写法
今天在写sql语句的时候,想确认下mysql的不等于运算符是用什么符号表示的 经过测试发现mysql中用<>与!=都是可以的,但sqlserver中不识别!=,所以建议用<> ...
- .NET SAAS 架构与设计 -SqlSugar ORM
1.数据库设计 常用的Saas分库分为2种类型的库 1.1 基础信息库 主要存组织架构 .权限.字典.用户等 公共信息 性能优化:因为基础信息库是共享的,所以我们可以使用 读写分离,或者二级缓存来进行 ...
- Spring DAO
Spring DAO 连接池 使用JDBC访问数据库是,频繁的打开连接和关闭连接,造成性能影响,所以有了连接池.数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接, ...
- MapReduce03 框架原理InputFormat数据输入
目录 1 InputFormat数据输入 1.1 切片与MapTask并行度决定机制 问题引出 MapTask并行度决定机制 Job提交流程源码 切片源码 1.2 FileInputFormat切片机 ...
- Android 高级UI组件(一)GridView与ListView
1.GridView 1.GridView学习 GridView和ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选 main.xml: <?xml version ...
- Android 基础UI组件(一)
1.Toast //显示文字 Toast.makeText(this,"Toast显示文本",Toast.LENGTH_SHORT).show(); //显示图片 Toast to ...