mysql binlog监听器

前置操作

1.查看mysql是否开启binlog

show variables like 'log_bin';

2.查看是否使用row格式的binlog

show variables like 'binlog_format';

3.如果以上都不是请修改mysql的配置文件添加或者修改如下内容

#配置binlog存放路径

log-bin=E://mysql//binlog//mysql-bin

#bin日志的格式 Mixed/row

binlog-format=row

4.重启mysql再次执行1.2步查看是否生效

使用

1.执行 mvn install

2.引入下面包

cn.bucheng

binlog-core

0.0.1-SNAPSHOT

3.添加下面配置

mysql.binlog.host=127.0.0.1

mysql.binlog.port=3306

mysql.binlog.username=root

mysql.binlog.password=123456

4.创建需要监听的实体对象

(目前默认将java字段转数库字段规则:将大写字母小写并在前面添加_ 比如 userName -转变为-> user_name)

@Data

@NoArgsConstructor

@AllArgsConstructor

@ToString

@TableName(schema = "ad_test", table = "ad_book")

public class BookEntity implements Serializable {

//如果数据库中列表和表名相同可以不用添加Column注解

private Long id;

private String name;

private String title;

private String writer;

@ColumnName(sqlColumn = "create_time")

private Date createTime;

@ColumnName(sqlColumn = "update_time")

private Date updateTime;

private String content;

}

5.创建监听并添加到springboot容器中

@Component

@Slf4j

public class BookListener implements IListener {

@Override

public Class getClassType() {

return BookEntity.class;

}

@Override

public void saveEvent(BookEntity data) {

log.info("save event, " + data);

}

@Override

public void updateEvent(BookEntity data) {

log.info("update event," + data);

}

@Override

public void deleteEvent(Serializable id) {

log.info("delete event," + id);

}

}

6.默认会将数据回设到对象上面当时存在有些字段回设不成功此时可以利用下面来实现高级用法

@Component

@Slf4j

public class BookHandle implements FieldValueHandle {

@Override

public Class getClassType() {

return BookEntity.class;

}

@Override

public BookEntity handle(Map values) {

log.info("decode column value to object");

BookEntity entity = BinLogUtils.decode(BookEntity.class, values);

Serializable content = values.get("content");

if(content!=null){

byte[] datas = (byte[])content;

entity.setContent(new String(datas));

}

return entity;

}

}

高级用法

1.记录binlog加载文件并初始化偏移量为0

@Component

@Slf4j

public class GlobalBinLogFileHandle implements IBinLogFileListener {

@Autowired

private RedisTemplate redisTemplate;

@Override

public void handleBinLogFile(String fileName, long position) {

redisTemplate.opsForHash().put("es-boot-binLog", "filename", fileName);

redisTemplate.opsForHash().put("es-boot-binLog", "position", position + "");

log.info("save binLogFile:{} position:{}",fileName,position);

}

}

2.记录binlog加载的偏移量

@Component

@Slf4j

public class GlobalCommitPositionHandle implements BinLogCommitPosition {

@Autowired

private RedisTemplate redisTemplate;

@Override

public void commitBinLogPosition(long position) {

log.info("update position to redis position:{}", position);

redisTemplate.opsForHash().put("es-boot-binLog", "position", position + "");

}

}

3.服务异常重启时恢复上次加载位置

@Slf4j

@Component

public class GlobalConfigHandle implements BinLogConfigHook {

@Autowired

private RedisTemplate redisTemplate;

@Override

public void config(BinLogConfig config) {

Object filename = redisTemplate.opsForHash().get("es-boot-binLog", "filename");

Object position = redisTemplate.opsForHash().get("es-boot-binLog", "position");

if (filename != null && !filename.equals("") && position != null && !"".equals(position + "")) {

log.info("begin load filename:{}, position:{}", filename, position);

config.setFile(filename + "");

config.setPosition(Long.parseLong(position + ""));

}

}

}

4.注意点,

>>1:不要使用监听的库存放上面记录,不然会出现死循环,也就binlog不断在变化

>>2:不要在监听器中进行耗时操作,这样会阻塞其他监听器及时接收消息能力。如果需要耗时的操作请采用开启线程进行操作

示例代码

请查看example模块中的readme

mysql实体监听器_GitHub - langjiangit/spring-boot-starter-mysql-binlog: mysql的binlog监听器相关推荐

  1. spring boot多数据源配置(mysql,redis,mongodb)实战

    使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...

  2. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)

    1 前言&概述 这篇文章是基于这篇文章的更新,主要是更新了一些技术栈以及开发工具的版本,还有修复了一些Bug. 本文是SpringBoot+Android+MySQL的增删查改的简单实现,用到 ...

  3. 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...

    Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置.不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置 ...

  4. 《SpringCloud超级入门》Spring Boot Starter的介绍及使用《七》

    目录 Spring Boot Starter项目创建 自动创建客户端 使用 Starter 使用注解开启 Starter 自动构建 使用配置开启 Starter 自动构建 配置 Starter 内容提 ...

  5. Spring Boot使用spring-data-jpa配置Mysql多数据源

    转载请注明出处 :Spring Boot使用spring-data-jpa配置Mysql多数据源 我们在之前的文章中已经学习了Spring Boot中使用mysql数据库 在单数据源的情况下,Spri ...

  6. 实现一个 Spring Boot Starter 原来如此简单,读 Starter 源码也不在话下

    我是风筝,公众号「古时的风筝」,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者.现已转行程序员鼓励师 Spring Cloud 系列文章已经完成,可以 ...

  7. 手把手教你定制标准 Spring Boot starter

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 写在前面 我们每次构建一个 Spring 应用程序时,我 ...

  8. 一个简易上手的短信服务Spring Boot Starter,连傻瓜都会!

    作 者:jackieonway 来 源:jianshu.com/u/36510c75d37c 短信服务在用户注册.登录.找回密码等相关操作中,可以让用户使用更加便捷,越来越多的公司都采用短信验证的方式 ...

  9. 快速开发一个自定义 Spring Boot Starter ,希望你也会

    来源:http://t.cn/Ai9li9fC 众所周知,Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增.在传统Maven项目中通常将一些层.组件拆分为 ...

  10. 自定义 Spring Boot Starter

    一.引言 什么是Spring Boot Starter呢?我们直接来看看官网是怎么介绍的吧. Starters are a set of convenient dependency descripto ...

最新文章

  1. String类的学习
  2. Eclipse 中导入jar包
  3. 【通知】2020年有三AI-CV夏季划升级,更多项目,更高难度,更加落地
  4. CentOS7下安装zookeeper3.4.9
  5. 笨方法“学习python笔记之字典
  6. require()和library()有什么区别?
  7. linux 查找并删除
  8. Teechart图表应用技术详解—第四章之工具组件概述
  9. python实现将android手机通讯录vcf文件转化为csv
  10. 2的6次方怎么用计算机,2的6次方是多少(进制转换计算器)
  11. cad缩放_CAD两种缩放技巧,你喜欢那个?
  12. android 6.0小游戏,宝宝汽车小游戏
  13. 《三国空城计》何为真知己真智慧
  14. 【Axure】Axure RP制作日期控件
  15. Android开发规范
  16. websocket服务端和html客户端进行二进制数据交互
  17. 2017年 团体程序设计天梯赛——题解集
  18. 习题 9.5 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输入10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
  19. 第四讲 Django编程填空题的测评
  20. linux嵌入式产品破解终端及telnet密码

热门文章

  1. SpringBoot2.x整合Redis 分布式集群_02
  2. Docker启动容器时出现错误
  3. 实战06_SSM整合ActiveMQ支持多种类型消息
  4. 解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接
  5. 防火墙contos6.8操作手册
  6. python request url 转义_Python爬虫入门笔记
  7. linux win10 时间同步服务器,windows和linux下服务器时间如何校正?
  8. C语言 指针声明和定义 - C语言零基础入门教程
  9. java jackson 注解,java – 如何使用Jackson注释序列化此JSON?
  10. linux 有名管道pipe,linux 用無名管道pipe和有名管道fifo實現線程間通信