版本至少jdk8

maven

  1. <!-- https://mvnrepository.com/artifact/com.alibaba.ververica/flink-connector-mysql-cdc -->
  2. <dependency>
  3. <groupId>com.alibaba.ververica</groupId>
  4. <artifactId>flink-connector-mysql-cdc</artifactId>
  5. <version>1.1.1</version>
  6. </dependency>

SqlDwdDeserializationSchema.java

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.alibaba.ververica.cdc.debezium.DebeziumDeserializationSchema;
  3. import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
  4. import org.apache.flink.api.common.typeinfo.TypeInformation;
  5. import org.apache.flink.util.Collector;
  6. import org.apache.kafka.connect.data.Field;
  7. import org.apache.kafka.connect.data.Struct;
  8. import org.apache.kafka.connect.source.SourceRecord;
  9.  
  10. import java.util.List;
  11.  
  12. /**
  13. * flinkCdc 数据结构解析成json
  14. * @author .
  15. */
  16. public class SqlDwdDeserializationSchema implements DebeziumDeserializationSchema<JSONObject> {
  17.  
  18. private static final long serialVersionUID = -3168848963265670603L;
  19.  
  20. @Override
  21. public void deserialize(SourceRecord record, Collector<JSONObject> out) throws Exception {
  22. Struct dataRecord = (Struct) record.value();
  23.  
  24. Struct afterStruct = dataRecord.getStruct("after");
  25. Struct beforeStruct = dataRecord.getStruct("before");
  26.  
  27. JSONObject operateJson = new JSONObject();
  28.  
  29. //操作的sql字段json数据
  30. JSONObject sqlJson = new JSONObject();
  31.  
  32. //操作类型
  33. String operate_type = "";
  34.  
  35. List<Field> fieldsList = null;
  36.  
  37. if (afterStruct != null && beforeStruct != null) {
  38. System.out.println("这是修改数据");
  39. operate_type = "update";
  40. fieldsList = afterStruct.schema().fields();
  41. for (Field field : fieldsList) {
  42. String fieldName = field.name();
  43. Object fieldValue = afterStruct.get(fieldName);
  44. sqlJson.put(fieldName, fieldValue);
  45. }
  46. } else if (afterStruct != null) {
  47. System.out.println("这是新增数据");
  48. operate_type = "insert";
  49. fieldsList = afterStruct.schema().fields();
  50. for (Field field : fieldsList) {
  51. String fieldName = field.name();
  52. Object fieldValue = afterStruct.get(fieldName);
  53. sqlJson.put(fieldName, fieldValue);
  54. }
  55. } else if (beforeStruct != null) {
  56. System.out.println("这是删除数据");
  57. operate_type = "delete";
  58. fieldsList = beforeStruct.schema().fields();
  59. for (Field field : fieldsList) {
  60. String fieldName = field.name();
  61. Object fieldValue = beforeStruct.get(fieldName);
  62. sqlJson.put(fieldName, fieldValue);
  63. }
  64. } else {
  65. System.out.println("error>>>>>>>>>你执行了啥?");
  66. }
  67.  
  68. operateJson.put("sqlJson", sqlJson);
  69.  
  70. Struct source = dataRecord.getStruct("source");
  71.  
  72. //操作的数据库名
  73. String database = source.getString("db");
  74.  
  75. //操作的表名
  76. String table = source.getString("table");
  77.  
  78. //操作的时间戳(单位:毫秒)
  79. Object operate_ms = source.get("ts_ms");
  80.  
  81. operateJson.put("database", database);
  82. operateJson.put("table", table);
  83. operateJson.put("operate_ms", operate_ms);
  84. operateJson.put("operate_type", operate_type);
  85.  
  86. String topic = record.topic();
  87. System.out.println("topic = " + topic);
  88.  
  89. /**
  90. * 主键字段,这里就只取一个主键 如果有多个 自行修改
  91. */
  92. Struct pk = (Struct) record.key();
  93. List<Field> pkFieldList = pk.schema().fields();
  94. if (pkFieldList != null && pkFieldList.size() > 0) {
  95. Field field = pkFieldList.get(0);
  96. //主键字段
  97. Object pkName = field.name();
  98. //主键字段的值
  99. Object pkValue = pk.get(field.name());
  100. operateJson.put("pk_filed", pkName);
  101. }
  102.  
  103. out.collect(operateJson);
  104. }
  105.  
  106. @Override
  107. public TypeInformation<JSONObject> getProducedType() {
  108. return BasicTypeInfo.of(JSONObject.class);
  109. }
  110. }

java代码

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.alibaba.ververica.cdc.connectors.mysql.MySQLSource;
  3. import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
  4. import org.apache.flink.streaming.api.functions.source.SourceFunction;
  5.  
  6. /**
  7. * @author 。
  8. */
  9. public class MySqlSourceExample {
  10. public static void main(String[] args) throws Exception {
  11. SourceFunction<JSONObject> mySqlSource = MySQLSource.<JSONObject>builder()
  12. .hostname("yourHostname")
  13. .port(yourPort)
  14. .databaseList("yourDatabaseName") // set captured database
  15. .tableList("yourDatabaseName.yourTableName") // set captured table
  16. .username("yourUsername")
  17. .password("yourPassword")
  18. .deserializer(new SqlDwdDeserializationSchema()) // converts SourceRecord to JSON String
  19. .build();
  20.  
  21. StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  22.  
  23. // enable checkpoint
  24. env.enableCheckpointing(3000);
  25.  
  26. env.addSource(mySqlSource).print();
  27.  
  28. env.execute("Print MySQL Snapshot + Binlog");
  29. }
  30. }

JAVA整合FlinkCDC 监控数据库表变化的更多相关文章

  1. 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化

    开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...

  2. Java 通过JDBC查询数据库表结构(字段名称,类型,长度等)

    Java 通过JDBC查询数据库表结构(字段名称,类型,长度等) 发布者:唛唛家的豆子   时间:2012-11-20 17:54:02   Java 通过JDBC查询数据库表结构(字段名称,类型,长 ...

  3. JAVA 自动生成对应数据库表的JPA代码工具

    http://blog.csdn.net/zheng2008hua/article/details/6274659 关键词:JPA 数据库表代码自动生成,JPA代码生成     自动生成对应数据库表的 ...

  4. Thingworx新建Thing的数据库表变化

    为了在Thingworx的基础上建立统一的可视化平台,并且对软件产品具有自主控制权,不依赖于Thingworx软件(防止因Thingworx的升级.Bug导致的自主扩展功能受制),所以最近在研究Thi ...

  5. SQL2008的数据更新跟踪测试 (监控数据表变化,可用于同步)

    POC过程如下: 这里我们建立一个测试环境,模拟数据在 Insert , Update 和 Delete 情况下的跟踪效果.1 .测试脚本的准备,下面脚本建立一个新的数据库环境,并作相应的跟踪配置后向 ...

  6. sqlDependency监控数据库数据变化,自动通知

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. 使用SqlDependency监听MSSQL数据库表变化通知

    SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...

  8. canal 监控数据库表 快速使用

    https://github.com/alibaba/canal 快速开始 https://github.com/alibaba/canal/wiki/QuickStart 注意 1. vim con ...

  9. springboot整合JPA创建数据库表失败

    org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "create table t_s ...

随机推荐

  1. DirectX12 3D 游戏开发与实战第十章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...

  2. 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 ...

  3. R语言与医学统计图形-【18】ggplot2几何对象汇总

    ggplot2绘图系统--几何对象汇总 前面介绍了常见的几种基本的几何对象,并且介绍了scale.stat等其他要素.后续将介绍position.themes.coord和faceting等函数. 这 ...

  4. rust shadow

    1 fn main() { 2 let mut demo = 12; 3 println!("{}",demo); 4 demo = 21; // 值可变,数据类型不可变 5 pr ...

  5. mysql 不等于 符号写法

    今天在写sql语句的时候,想确认下mysql的不等于运算符是用什么符号表示的 经过测试发现mysql中用<>与!=都是可以的,但sqlserver中不识别!=,所以建议用<> ...

  6. .NET SAAS 架构与设计 -SqlSugar ORM

    1.数据库设计 常用的Saas分库分为2种类型的库 1.1 基础信息库 主要存组织架构 .权限.字典.用户等 公共信息 性能优化:因为基础信息库是共享的,所以我们可以使用 读写分离,或者二级缓存来进行 ...

  7. Spring DAO

    Spring DAO 连接池 使用JDBC访问数据库是,频繁的打开连接和关闭连接,造成性能影响,所以有了连接池.数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接, ...

  8. MapReduce03 框架原理InputFormat数据输入

    目录 1 InputFormat数据输入 1.1 切片与MapTask并行度决定机制 问题引出 MapTask并行度决定机制 Job提交流程源码 切片源码 1.2 FileInputFormat切片机 ...

  9. Android 高级UI组件(一)GridView与ListView

    1.GridView 1.GridView学习 GridView和ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选 main.xml: <?xml version ...

  10. Android 基础UI组件(一)

    1.Toast //显示文字 Toast.makeText(this,"Toast显示文本",Toast.LENGTH_SHORT).show(); //显示图片 Toast to ...