Canal实时解析mysql binlog数据实战

一、说明

通过canal实时监听mysql binlog日志文件的变化,并将数据解析出来

二、环境准备

1、创建maven项目并修改pom.xml配置文件

com.alibaba.otter
            canal.client
            1.1.4

Canal实时解析mysql binlog数据实战

2、嗦代码

特别说明:在解析数据时,相当于程序是客户端,客户端在连接canal服务端时是不需要用户名和密码

import com.alibaba.fastjson.JSONObject;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.protocol.CanalEntry;
import com.alibaba.otter.canal.protocol.Message;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;

import java.net.InetSocketAddress;
import java.util.List;

public class CanalClient {
    public static void main(String[] args) throws InterruptedException, InvalidProtocolBufferException {

    // 获取连接
    CanalConnector canalConnector=CanalConnectors.newSingleConnector(new InetSocketAddress("192.168.140.131",11111),
            "example","","");

    while(true)
    {
       // 连接
        canalConnector.connect();
        // 订阅数据库
        canalConnector.subscribe("CanalDb.*");
        // 获取数据
        Message message = canalConnector.get(100);
        // 获取Entry集合
        List entries=message.getEntries();
        // 判断集合是否为空,如果为空,则线程等待2秒再拉取数据
        if (entries.size())
        {
            System.out.println("当次抓取没有数据,休息一会儿。。。");
            Thread.sleep(2000);
        }
        else
        {
            // 遍历entries,单条解析
            for (CanalEntry.Entry entry:entries)
            {
               // 1,获取表名
                String tableName=entry.getHeader().getTableName();
                // 2,获取类型
                CanalEntry.EntryType entryType=entry.getEntryType();
                // 3,获取序列化后的数据
                ByteString storeValue=entry.getStoreValue();
                // 4.判断当前entryType类型是否为ROWDATA
                if (CanalEntry.EntryType.ROWDATA.equals(entryType))
                {
                    //5.反序列化数据
                    CanalEntry.RowChange rowChange=CanalEntry.RowChange.parseFrom(storeValue);
                    //6.获取当前事件的操作类型
                    CanalEntry.EventType eventType=rowChange.getEventType();
                    //7.获取数据集
                    List rowDataList=rowChange.getRowDatasList();
                    //8.遍历rowDataList并打印数据集
                    for(CanalEntry.RowData rowData:rowDataList)
                    {
                        JSONObject beforData=new JSONObject();
                        List beforClountList=rowData.getBeforeColumnsList();
                        for (CanalEntry.Column column:beforClountList)
                        {
                            beforData.put(column.getName(),column.getValue());
                        }
                        JSONObject afterData=new JSONObject();
                        List afterClountList=rowData.getAfterColumnsList();
                        for (CanalEntry.Column column:afterClountList)
                        {
                            afterData.put(column.getName(),column.getValue());
                        }
                        // 打印数据
                        System.out.println(""+tableName+
                                ",EventType:"+eventType+
                                ",Before:"+beforData+
                                ",After:"+afterData);
                    }

                }
                else
                {
                    System.out.println("当前操作类型为"+entryType);
                }
            }
        }
    }
  }
}

三、项目效果

Canal实时解析mysql binlog数据实战

Original: https://www.cnblogs.com/sportsky/p/16530806.html
Author: SportSky
Title: Canal实时解析mysql binlog数据实战

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609208/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Docker安装教程

    这里介绍两种安装方法:centsOS安装和Ubuntu安装 CentOS安装 linux内核版本建议3.8以上,作者本人使用的是3.10;查看内核版本命令:uname -r 一般C…

    Linux 2023年5月27日
    0115
  • GCC常见命令

    rwx 对于目录和文件的区别 文件 目录 r 文件的内容可以被查看。支持cat、more、head…vim 目录的内容可以被查看。ls、tree w 文件的内容可以被添…

    Linux 2023年6月6日
    0115
  • springboot工程引用本地lib文件夾内的jar包,打包時把依賴jar包打入jar包

    本地工程新建lib文件夾,并放入jar包 springboot工程引用lib文件夹下的jar包 pom中增加 com.aliyun.vcs.dataengine common sy…

    Linux 2023年6月8日
    0103
  • 节约内存:Instagram的Redis实践(转)

    1.M emcached 内存Key-Value Cache Redis 内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级…

    Linux 2023年5月28日
    099
  • linux 添加java环境

    将下载的jdk解压到/usr/local/下 设置软链接 在/etc/profile.d/java.sh 添加如下内容(建议在/etc/profile.d/添加环境变量) 生效配置…

    Linux 2023年6月8日
    060
  • docker操作常用命令:

    镜像查询:docker seacher xxxx 下载: dcoker pull xxx 查看下载的镜像: docker images 运行docker :以redis 为例: d…

    Linux 2023年6月13日
    090
  • Ubuntu下安装多个JDK,并设置其中一个为默认JDK

    由于使用需要,要在机器上同时安装OpenJDK 8和11,并将8设置为默认JDK 首先安装OpenJDK sudo apt-get install openjdk-8-jdk su…

    Linux 2023年6月6日
    0103
  • @Aspect

    AOP是指在程序运行期间动态地将某段代码切入到指定位置并运行的编程方式。 AOP详解可参考:https://blog.csdn.net/javazejian/article/det…

    Linux 2023年6月8日
    0106
  • 如何优雅的处理 accept 出现 EMFILE 的问题

    通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输 在服务器的开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数…

    Linux 2023年6月13日
    094
  • Springboot 的一些默认配置规则

    本文样例说明仅适用 maven 环境和语法,但所述内容也适用 gradle 1. logback 日志默认为 slf4j + logback 框架,引入如下 jar 之后,就自动引…

    Linux 2023年6月6日
    088
  • python 内置模块

    #!/usr/bin/env python -*- coding:utf-8 -*- import time #时间模块 print(time.time())#当前时间戳 #本地时…

    Linux 2023年6月13日
    077
  • CKS考试心得分享

    CKS证书 考试相关 考试报名准备 CKS考试和CKA考试一样,已经开放中国大陆的考试。但区别是CKS目前没有中文题目,考试都是英文题目,唯一区别是CKS中文考试是中文老师监考,仅…

    Linux 2023年6月13日
    0108
  • jenkins 设置钉钉机器人+jenkins调用shell脚本使用钉钉机器人自定义发消息并通知指定人

    两种钉钉通知方式,一种是使用安装的钉钉插件来通知,但是这个不好定义通知内容,没办法控制发送条件,只要配置了,不管构建参数(分支,渠道,配置),都会发通知,第二种是使用脚本的方式来通…

    Linux 2023年5月28日
    091
  • ztreejs树 metro风格 鼠标经过 显示用户自定义控件 新增,编辑,删除,向下,向上操作

    php;gutter:true; ztreejs树功能说明:自定义控件功能新增,编辑,删除,向下移动,向上移动已实现,只是前端,如果需要跟后台交互,封装对应的函数,在相应位置调用即…

    Linux 2023年6月7日
    085
  • 【Example】C++运算符重载

    首先,阅读之前要先搞清楚什么是运算符、函数重载。函数重载就是在一个范围内为一个函数声明多个实现方式,函数名必须一致。 那么C++运算符是否可以重载呢?可以!先弄清什么时候需要进行运…

    Linux 2023年6月13日
    0110
  • Jenkins中HTML报告无法正常显示问题解决

    自动化结果生成了HTML报告,但是在Jenkins中打开报告却显示空白,打开控制台,可以看到该报错 参考https://www.jenkins.io/doc/book/securi…

    Linux 2023年6月6日
    0110
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球