|
@@ -1,11 +1,14 @@
|
|
package com.alibaba.otter.canal.kafka;
|
|
package com.alibaba.otter.canal.kafka;
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Properties;
|
|
import java.util.Properties;
|
|
|
|
+import java.util.concurrent.Future;
|
|
|
|
|
|
import org.apache.kafka.clients.producer.KafkaProducer;
|
|
import org.apache.kafka.clients.producer.KafkaProducer;
|
|
import org.apache.kafka.clients.producer.Producer;
|
|
import org.apache.kafka.clients.producer.Producer;
|
|
import org.apache.kafka.clients.producer.ProducerRecord;
|
|
import org.apache.kafka.clients.producer.ProducerRecord;
|
|
|
|
+import org.apache.kafka.clients.producer.RecordMetadata;
|
|
import org.apache.kafka.common.serialization.StringSerializer;
|
|
import org.apache.kafka.common.serialization.StringSerializer;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -14,8 +17,7 @@ import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.otter.canal.common.MQProperties;
|
|
import com.alibaba.otter.canal.common.MQProperties;
|
|
import com.alibaba.otter.canal.protocol.FlatMessage;
|
|
import com.alibaba.otter.canal.protocol.FlatMessage;
|
|
import com.alibaba.otter.canal.protocol.Message;
|
|
import com.alibaba.otter.canal.protocol.Message;
|
|
-import com.alibaba.otter.canal.spi.CanalMQProducer;
|
|
|
|
-;
|
|
|
|
|
|
+import com.alibaba.otter.canal.spi.CanalMQProducer;;
|
|
|
|
|
|
/**
|
|
/**
|
|
* kafka producer 主操作类
|
|
* kafka producer 主操作类
|
|
@@ -74,9 +76,10 @@ public class CanalKafkaProducer implements CanalMQProducer {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void send(MQProperties.CanalDestination canalDestination, Message message, Callback callback) {
|
|
public void send(MQProperties.CanalDestination canalDestination, Message message, Callback callback) {
|
|
- try {
|
|
|
|
- // producer.beginTransaction();
|
|
|
|
- if (!kafkaProperties.getFlatMessage()) {
|
|
|
|
|
|
+
|
|
|
|
+ // producer.beginTransaction();
|
|
|
|
+ if (!kafkaProperties.getFlatMessage()) {
|
|
|
|
+ try {
|
|
ProducerRecord<String, Message> record;
|
|
ProducerRecord<String, Message> record;
|
|
if (canalDestination.getPartition() != null) {
|
|
if (canalDestination.getPartition() != null) {
|
|
record = new ProducerRecord<String, Message>(canalDestination.getTopic(),
|
|
record = new ProducerRecord<String, Message>(canalDestination.getTopic(),
|
|
@@ -87,58 +90,76 @@ public class CanalKafkaProducer implements CanalMQProducer {
|
|
record = new ProducerRecord<String, Message>(canalDestination.getTopic(), 0, null, message);
|
|
record = new ProducerRecord<String, Message>(canalDestination.getTopic(), 0, null, message);
|
|
}
|
|
}
|
|
|
|
|
|
- producer.send(record);
|
|
|
|
- } else {
|
|
|
|
- // 发送扁平数据json
|
|
|
|
- List<FlatMessage> flatMessages = FlatMessage.messageConverter(message);
|
|
|
|
- if (flatMessages != null) {
|
|
|
|
- for (FlatMessage flatMessage : flatMessages) {
|
|
|
|
- if (canalDestination.getPartition() != null) {
|
|
|
|
- ProducerRecord<String, String> record = new ProducerRecord<String, String>(canalDestination.getTopic(),
|
|
|
|
- canalDestination.getPartition(),
|
|
|
|
- null,
|
|
|
|
- JSON.toJSONString(flatMessage));
|
|
|
|
|
|
+ producer.send(record).get();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
+ // producer.abortTransaction();
|
|
|
|
+ callback.rollback();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // 发送扁平数据json
|
|
|
|
+ List<FlatMessage> flatMessages = FlatMessage.messageConverter(message);
|
|
|
|
+ if (flatMessages != null) {
|
|
|
|
+ for (FlatMessage flatMessage : flatMessages) {
|
|
|
|
+ if (canalDestination.getPartition() != null) {
|
|
|
|
+ try {
|
|
|
|
+ ProducerRecord<String, String> record = new ProducerRecord<String, String>(canalDestination
|
|
|
|
+ .getTopic(), canalDestination.getPartition(), null, JSON.toJSONString(flatMessage));
|
|
producer2.send(record);
|
|
producer2.send(record);
|
|
- } else {
|
|
|
|
- if (canalDestination.getPartitionHash() != null
|
|
|
|
- && !canalDestination.getPartitionHash().isEmpty()) {
|
|
|
|
- FlatMessage[] partitionFlatMessage = FlatMessage.messagePartition(flatMessage,
|
|
|
|
- canalDestination.getPartitionsNum(),
|
|
|
|
- canalDestination.getPartitionHash());
|
|
|
|
- int length = partitionFlatMessage.length;
|
|
|
|
- for (int i = 0; i < length; i++) {
|
|
|
|
- FlatMessage flatMessagePart = partitionFlatMessage[i];
|
|
|
|
- if (flatMessagePart != null) {
|
|
|
|
- ProducerRecord<String, String> record = new ProducerRecord<String, String>(canalDestination.getTopic(),
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
+ // producer.abortTransaction();
|
|
|
|
+ callback.rollback();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (canalDestination.getPartitionHash() != null
|
|
|
|
+ && !canalDestination.getPartitionHash().isEmpty()) {
|
|
|
|
+ FlatMessage[] partitionFlatMessage = FlatMessage.messagePartition(flatMessage,
|
|
|
|
+ canalDestination.getPartitionsNum(),
|
|
|
|
+ canalDestination.getPartitionHash());
|
|
|
|
+ int length = partitionFlatMessage.length;
|
|
|
|
+ for (int i = 0; i < length; i++) {
|
|
|
|
+ FlatMessage flatMessagePart = partitionFlatMessage[i];
|
|
|
|
+ if (flatMessagePart != null) {
|
|
|
|
+ try {
|
|
|
|
+ ProducerRecord<String, String> record = new ProducerRecord<String, String>(
|
|
|
|
+ canalDestination.getTopic(),
|
|
i,
|
|
i,
|
|
null,
|
|
null,
|
|
JSON.toJSONString(flatMessagePart));
|
|
JSON.toJSONString(flatMessagePart));
|
|
- producer2.send(record);
|
|
|
|
|
|
+ producer2.send(record).get();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
+ // producer.abortTransaction();
|
|
|
|
+ callback.rollback();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- ProducerRecord<String, String> record = new ProducerRecord<String, String>(canalDestination.getTopic(),
|
|
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ try {
|
|
|
|
+ ProducerRecord<String, String> record = new ProducerRecord<String, String>(
|
|
|
|
+ canalDestination.getTopic(),
|
|
0,
|
|
0,
|
|
null,
|
|
null,
|
|
JSON.toJSONString(flatMessage));
|
|
JSON.toJSONString(flatMessage));
|
|
- producer2.send(record);
|
|
|
|
|
|
+ producer2.send(record).get();
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error(e.getMessage(), e);
|
|
|
|
+ // producer.abortTransaction();
|
|
|
|
+ callback.rollback();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
- // producer.commitTransaction();
|
|
|
|
- callback.commit();
|
|
|
|
- if (logger.isDebugEnabled()) {
|
|
|
|
- logger.debug("send message to kafka topic: {}", canalDestination.getTopic());
|
|
|
|
- }
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- logger.error(e.getMessage(), e);
|
|
|
|
- // producer.abortTransaction();
|
|
|
|
- callback.rollback();
|
|
|
|
|
|
+ // producer.commitTransaction();
|
|
|
|
+ callback.commit();
|
|
|
|
+ if (logger.isDebugEnabled()) {
|
|
|
|
+ logger.debug("send message to kafka topic: {}", canalDestination.getTopic());
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|