文章目录
前言
在日常Kafka使用中,大部分场景下,消息间的传递使用的是JSON格式字符串,同时生产者和消费者使用String序列化和反序列化方式进行处理。这篇博文,将介绍如何使用自定义实体类,在生产者和消费者之间流淌,以及可能出现的问题。
一、准备工作
在Kafka中,消息使用byte数组方式进行存储,而为了方便代码处理,在此基础上增加了序列化和反序列化动作。同时,在消息发送时,需要指定序列化方式,消息消费时,需要指定反序列化方式。在之前博文中,我们使用的是String的序列化和反序列化方式。在这里,我们将其修改成JSON的方式。
public Map<String, Object> producerProperties() {
Map<String, Object> producerProperty = new HashMap<>();
// 此处使用JSON格式,进行序列化和反序列化。
producerProperty.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
producerProperty.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
producerProperty.put(ProducerConfig.ACKS_CONFIG, "1");
producerProperty.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVER);
producerProperty.put(ProducerConfig.CLIENT_ID_CONFIG, "220101_client_producer");
producerProperty.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "snappy");
return producerProperty;
}
public Map<String, Object> consumerProperties() {
Map<String, Object> consumerProperty = new HashMap<>();
// 指定消费者,反序列化方式,与生产者配套使用。
consumerProperty.put(ConsumerConfig.GROUP_ID_CONFIG, "220101_GROUP");
consumerProperty.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.0.101:9092");
consumerProperty.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
consumerProperty.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
consumerProperty.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
consumerProperty.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
return consumerProperty;
}
// 定义消息传递的实体类
@Getter
@Setter
@ToString
public class TranslateInfo {
private String name;
private int age;
private String phoneNumber;
}
// 消费消息,与下面的消息发送,匹配。
@KafkaListener(topics = "220109", containerFactory = "listenerContainerFactory")
public void messageInfoListener(List<TranslateInfo> infoes, Acknowledgment ack) {
try {
log.info("resieve entity messag