import com.alibaba.otter.canal.protocol.CanalEntry; //导入方法依赖的package包/类
@Override
public int processHeartBeatMessage(Map> map, IGenericMessage obj) throws IOException {
MysqlGenericMessage message = (MysqlGenericMessage) obj;
CanalEntry.Entry entry = message.getEntry();
CanalEntry.EventType eventType = entry.getHeader().getEventType();
if(eventType != CanalEntry.EventType.INSERT) {
//skip it.
logger.info ("Skipped a DB_HEARTBEAT_MONITOR message which is not INSERT Type! :" + eventType.toString());
return -1;
}
CanalEntry.RowChange rowChange = CanalEntry.RowChange.parseFrom(entry.getStoreValue());
List dataList = rowChange.getRowDatasList();
if (dataList.size() != 1) {
throw new RuntimeException(String.format("DB_HEARTBEAT_MONITOR 发现 %d 条bach数据,应该只有一条", dataList.size()));
}
String dsName = null;
String schemaName = null;
String tableName = null;
String packetJson = null;
List columns = dataList.get(0).getAfterColumnsList();
for (CanalEntry.Column column : columns) {
if (column.getName().equalsIgnoreCase("DS_NAME")) {
dsName = column.getValue();
} else if (column.getName().equalsIgnoreCase("SCHEMA_NAME")) {
schemaName = column.getValue();
} else if (column.getName().equalsIgnoreCase("TABLE_NAME")) {
tableName = column.getValue();
} else if (column.getName().equalsIgnoreCase("PACKET"))
packetJson = column.getValue();
}
if (dsName == null || schemaName == null || tableName == null || packetJson == null) {
throw new RuntimeException("DB_HEARTBEAT_MONITOR 发现 dsName 或 schema 或 table, 或 packetJson 为空.");
}
if (!dsName.equalsIgnoreCase(dsInfo.getDbSourceName())) {
logger.info("Skipped other datasource HeartBeat! : {}.{}.{}" , dsName, schemaName, tableName);
return -1;
}
//logger.info(String.format("Get DB_HEARTBEAT_MONITOR message : %s.%s", schemaName, tableName));
if (packetJson.indexOf("checkpoint") >= 0) {
HeartBeatPacket packet = HeartBeatPacket.parse(packetJson);
statMeter(schemaName, tableName, packet.getTime(), packet.getTxtime());
}
List subList = map.get(schemaName);
if (subList != null) {
subList.add(message);
} else {
subList = new ArrayList<>();
subList.add(message);
map.put(schemaName, subList);
}
return 0;
}