otter是阿里开源的一个数据库同步工具,如果是表级或库级别的同步那就相当简单了,只需要简单的配置就可实现,如果针对表字段级别的过滤,是需要自己写java代码了
如果是表字段级别的过滤,示例代码如下:
package com.alibaba.otter.node.extend.processor;
import com.alibaba.otter.shared.etl.model.EventColumn;
import com.alibaba.otter.shared.etl.model.EventData;
import org.apache.commons.lang.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
public class TestEventProcessor extends AbstractEventProcessor {
public boolean process(EventData eventData) {
/**
* 定义采购组织编码
*/
String orgCode = "aaa";
/**
* 定义租户ID
*/
Long tenantId = 1L;
Boolean isHandle = true;
/**
* 需要过滤租户和采购组织的集合
*/
List<String> tenantIdAndOrgCodeList = Arrays.asList("db_user", "db_role");
/**
* 需要过滤租户的集合
*/
List<String> tenantIdList = Arrays.asList("db_tenant", "db_materiel");
/**
* 需要过滤采购组织的集合
*/
List<String> orgCodeList = Arrays.asList("db_orgcode");
/**
* 过滤采购组织和租户ID
*/
for (String tenantIdAndOrgCode: tenantIdAndOrgCodeList) {
if(StringUtils.equals(tenantIdAndOrgCode, eventData.getTableName())) {
EventColumn orgCodeColumn = getColumn(eventData, "org_code");
EventColumn tenantIdColumn = getColumn(eventData, "tenant_id");
//过滤采购组织和租户ID,不是此采购组织和租户ID的不同步
if (!orgCode.equals(orgCodeColumn.getColumnValue()) && !String.valueOf(tenantId).equals(tenantIdColumn.getColumnValue())) {
isHandle = false;
}
}
}
/**
* 过滤租户ID
*/
for (String tenantIdItem: tenantIdList) {
if(StringUtils.equals(tenantIdItem, eventData.getTableName())) {
EventColumn tenantIdColumn = getColumn(eventData, "tenant_id");
//过滤租户ID,不是此租户ID的不同步
if (!String.valueOf(tenantId).equals(tenantIdColumn.getColumnValue())) {
isHandle = false;
}
}
}
/**
* 过滤采购组织
*/
for (String orgCodeItem: orgCodeList) {
if(StringUtils.equals(orgCodeItem, eventData.getTableName())) {
EventColumn orgCodeColumn = getColumn(eventData, "org_code");
//过滤租户ID,不是此租户ID的不同步
if (!orgCode.equals(orgCodeColumn.getColumnValue())) {
isHandle = false;
}
}
}
return isHandle;
}
}
解决mysql字段是json类型的处理,示例代码如下:
package com.alibaba.otter.node.extend.processor;
import com.alibaba.otter.shared.etl.model.EventColumn;
import com.alibaba.otter.shared.etl.model.EventData;
import org.apache.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
import java.util.List;
import java.util.HashSet;
import java.util.Set;
public class TestEventProcessor extends AbstractEventProcessor {
/**
*定义字段名称
*/
private static final Set<String> JSON_FIELD_SET = new HashSet<>();
public boolean process(EventData eventData) {
/**
* 定义采购组织编码
*/
String orgCode = "bbb";
/**
* 定义租户ID
*/
Long tenantId = 1L;
Boolean isHandle = true;
// 添加需要判断为 JSON 格式的字段名到 JSON_FIELD_SET 中
//
JSON_FIELD_SET.add("name_json");
/**
* 转化json格式
*/
for (EventColumn eventColumn : eventData.getColumns()) {
if (JSON_FIELD_SET.contains(eventColumn.getColumnName())) {
String jsonValue = eventColumn.getColumnValue();
if (StringUtils.isBlank(jsonValue)) {
continue;
}
eventColumn.setColumnValue(JSON.toJSONString(JSONObject.parse(jsonValue)));
}
}
return isHandle;
}
}