canal-spring-boot-starter修改

1,657 阅读1分钟

使用Canal监听数据库时官方提供的canal-client不太方便,我们采用canal-spring-boot-starter这个库,但是这个库有些BUG,目前作者也不再维护了,只能下载源码到本地进行修改后发布到私有仓库中使用,下面步入正题。

类型转换可能报异常

原因是StringConvertUtil.convertType方法参数columnValue可能为空字符串 在数据类型转换之前做下判断即可

static Object convertType(Class<?> type, String columnValue) {
    if(columnValue==null){
        return null;
    }else if (type.equals(Integer.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return Integer.parseInt(columnValue);
    } else if (type.equals(Long.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return Long.parseLong(columnValue);
    } else if (type.equals(Boolean.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return convertToBoolean(columnValue);
    } else if (type.equals(BigDecimal.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return new BigDecimal(columnValue);
    } else if (type.equals(Double.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return Double.parseDouble(columnValue);
    } else if (type.equals(Float.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return Float.parseFloat(columnValue);
    } else if (type.equals(Date.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return parseDate(columnValue);
    } else if (type.equals(java.sql.Date.class)) {
        if (StringUtils.isEmpty(columnValue)) {
            return null;
        }
        return parseDate(columnValue);
    } else {
        return columnValue;
    }
}

实体类@Column中字段名添加了``会取不到值

EntryUtil.getColumnName方法替换掉``即可

private static String getColumnName(Field field) {
    Column annotation = field.getAnnotation(Column.class);
    if (annotation != null) {
        return annotation.name().replaceAll("`", "");
    } else {
        return field.getName();
    }
}

启动程序后一直打印“获取消息”日志

在application.yml中设置日志级别大于info

logging:
  level:
    top.javatool.canal.client: warn

或者修改AbstractCanalClient,注释掉日志打印

Update时希望得到更新了哪些字段

EntryHandler接口update方法修改如下

default void update(T before, T after, Set<String> updateColumnSet) {

}

RowDataHandlerImpl中update添加上updateColumnSet

entryHandler.update(before, after, updateColumnSet);