package com.bigdata.flink.cdc.debezium;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.ververica.cdc.debezium.DebeziumDeserializationSchema;
import com.bigdata.flink.cdc.tool.IdTool;
import com.bigdata.flink.cdc.tool.MDCTool;
import io.debezium.time.Timestamp;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.util.Collector;
import org.apache.kafka.connect.data.Field;
import org.apache.kafka.connect.data.Schema;
import org.apache.kafka.connect.data.Struct;
import org.apache.kafka.connect.source.SourceRecord;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
@Slf4j
public class FastjonDeserializationSchema implements DebeziumDeserializationSchema<String> {
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
@Override
public void deserialize(SourceRecord record, Collector<String> out) throws Exception {
String simpleUUID = IdTool.simpleUUID();
MDCTool.putTraceId(simpleUUID);
log.info("deserialize.开始时间:" + LocalDateTime.now());
Struct dataRecord = (Struct)record.value();
/**
* 1、同时存在 beforeStruct 跟 afterStruct数据的话,就代表是update的数据
* 2、只存在 beforeStruct 就是delete数据
* 3、只存在 afterStruct数据 就是insert数据
*/
JSONObject fastJson = new JSONObject();
List<Field> fieldList = null;
Struct beforeStruct = dataRecord.getStruct("before");
if(beforeStruct != null){
JSONObject beforeJson = new JSONObject();
fieldList = beforeStruct.schema().fields();
for (Field field : fieldList) {
Schema schema = field.schema();
String fieldName = field.name();
Object fieldValue = beforeStruct.get(fieldName);
if(Timestamp.SCHEMA_NAME.equals(schema.name()) && fieldValue != null){
long epochMillis = Timestamp.toEpochMillis(fieldValue, temporal -> temporal.minus(8, ChronoUnit.HOURS));
if(String.valueOf(epochMillis).equals(String.valueOf(fieldValue))){
epochMillis = epochMillis - 8*60*60*1000;
}
beforeJson.put(fieldName, epochMillis);
} else {
beforeJson.put(fieldName, fieldValue);
}
}
fastJson.put("before", beforeJson);
}
Struct afterStruct = dataRecord.getStruct("after");