Tips:需要传入自定义序列化方式,通常情况下我们都是使用StringSerializationSchema,但是该情况只能序列化String类型的数据,如果我们要序列化视频、图片、音频等格式,则需要自定义序列化方式
让调用者自定义序列化方式
public static <T> FlinkKafkaProducer<T> getKafkaSinkBySchema(KafkaSerializationSchema<T> kafkaSerializationSchema) {
Properties props = new Properties();
props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,KAFKA_SERVER);
//设置生产数据的超时时间
props.setProperty(ProducerConfig.TRANSACTION_TIMEOUT_CONFIG,15*60*1000+"");
return new FlinkKafkaProducer<T>(DEFAULT_TOPIC, kafkaSerializationSchema, props, FlinkKafkaProducer.Semantic.EXACTLY_ONCE);
}
如对JSONObject类型进行序列化
FlinkKafkaProducer<JSONObject> kafkaSink = MyKafkaUtil.getKafkaSinkBySchema(
new KafkaSerializationSchema<JSONObject>() {
@Override
public void open(SerializationSchema.InitializationContext context) throws Exception {
System.out.println("kafka序列化");
}
@Override
public ProducerRecord<byte[], byte[]> serialize(JSONObject jsonObj, @Nullable Long timestamp) {
// 获取Topic
String sinkTopic = jsonObj.getString("sink_table");
// 从JSONObject对象中取出data字段,将data字段打入Kafka
JSONObject dataJsonObj = jsonObj.getJSONObject("data");
// 需要传入 Topic 和 Value
return new ProducerRecord<>(sinkTopic,dataJsonObj.toString().getBytes());
}
}
);