东莞学做网站,中国空间站完成了多少,网站网商,推广普通话奋进新征程宣传语mysql binlog监听器前置操作1.查看mysql是否开启binlogshow variables like log_bin;2.查看是否使用row格式的binlogshow variables like binlog_format;3.如果以上都不是请修改mysql的配置文件添加或者修改如下内容#配置binlog存放路径log-binE://mysql//binlog//mysql-bin#bi…mysql binlog监听器前置操作1.查看mysql是否开启binlogshow variables like log_bin;2.查看是否使用row格式的binlogshow variables like binlog_format;3.如果以上都不是请修改mysql的配置文件添加或者修改如下内容#配置binlog存放路径log-binE://mysql//binlog//mysql-bin#bin日志的格式 Mixed/rowbinlog-formatrow4.重启mysql再次执行1.2步查看是否生效使用1.执行 mvn install2.引入下面包cn.buchengbinlog-core0.0.1-SNAPSHOT3.添加下面配置mysql.binlog.host127.0.0.1mysql.binlog.port3306mysql.binlog.usernamerootmysql.binlog.password1234564.创建需要监听的实体对象(目前默认将java字段转数库字段规则将大写字母小写并在前面添加_ 比如 userName -转变为- user_name)DataNoArgsConstructorAllArgsConstructorToStringTableName(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容器中ComponentSlf4jpublic class BookListener implements IListener {Overridepublic Class getClassType() {return BookEntity.class;}Overridepublic void saveEvent(BookEntity data) {log.info(save event, data);}Overridepublic void updateEvent(BookEntity data) {log.info(update event, data);}Overridepublic void deleteEvent(Serializable id) {log.info(delete event, id);}}6.默认会将数据回设到对象上面当时存在有些字段回设不成功此时可以利用下面来实现高级用法ComponentSlf4jpublic class BookHandle implements FieldValueHandle {Overridepublic Class getClassType() {return BookEntity.class;}Overridepublic 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加载文件并初始化偏移量为0ComponentSlf4jpublic class GlobalBinLogFileHandle implements IBinLogFileListener {Autowiredprivate RedisTemplate redisTemplate;Overridepublic 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加载的偏移量ComponentSlf4jpublic class GlobalCommitPositionHandle implements BinLogCommitPosition {Autowiredprivate RedisTemplate redisTemplate;Overridepublic void commitBinLogPosition(long position) {log.info(update position to redis position:{}, position);redisTemplate.opsForHash().put(es-boot-binLog, position, position );}}3.服务异常重启时恢复上次加载位置Slf4jComponentpublic class GlobalConfigHandle implements BinLogConfigHook {Autowiredprivate RedisTemplate redisTemplate;Overridepublic 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