版本至少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 监控数据库表变化的更多相关文章

  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. stat命令的实现-mysate(必做)

    学习使用stat(1),并用C语言实现 1. 提交学习stat(1)的截图 使用 man 1 stat 查看帮助手册 从图中可以看到stat的用法是display file or file syste ...

  2. 【虚树学习笔记([SDOI2011]消耗战)】

    题意 [SDOI2011]消耗战 想法 首先我们可以很自然的想到怎么在整棵树上进行求解\(DP\) 很简单 每个点有两个选择 要么对其子树的关键点递归求解 要么自己断开 当然断开的\(cost\)为其 ...

  3. 洛谷 P5540 - [BalkanOI2011] timeismoney | 最小乘积生成树(最小生成树)

    洛谷题面传送门 大概是一个比较 trivial 的小 trick?学过了就不要忘了哦( 莫名奇妙地想到了 yyq 的"hot tea 不常有,做过了就不能再错过了" 首先看到这种二 ...

  4. P7327 Dream and Discs

    题目传送门. 题意简述:有 \(n\) 个数 \(a_1,a_2,\cdots a_n\),等概率选取区间 \(P_1,S_1\subseteq [1,n]\),\(P_2\subseteq P_1\ ...

  5. #pragma warning(disable:4996)

    VS使用中常常会遇到一些过时或者不安全的函数,编译会报错: 错误 C4996 'sscanf': This function or variable may be unsafe. Consider u ...

  6. Docker Alpine Dockerfile 安装nginx,最小镜像

    Docker Alpine Dockerfile 安装nginx,最小镜像 FROM alpine MAINTAINER will ## 将alpine-linux:apk的安装源改为国内镜像 RUN ...

  7. zabbix-磁盘状态脚本

    #/bin/sh Device=$1 DISK=$2 case $DISK in tps) iostat -dmt 1 2|grep "\b$Device\b"|tail -1|a ...

  8. 4.Reverse Words in a String-Leetcode

    class Solution { public: void reverseWords(string &s) { vector<string> data; string word; ...

  9. shell 脚本的基本定义

    注意不能有控制,指令之间 [1]shell脚本的基础知识 (1)shell脚本的本质 编译型语言 解释型语言 shell脚本语言是解释型语言 shell脚本的本质 shell命令的有序集合 (2)sh ...

  10. 学习java 7.28

    学习内容: Applet Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java ...