package com.mobai.kafka; import com.alibaba.fastjson.JSON; import com.mobai.domian.Vehicle; import lombok.extern.log4j.Log4j2; import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.CreatePartitionsResult; import org.apache.kafka.clients.admin.ListTopicsResult; import org.apache.kafka.clients.admin.NewPartitions; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.Cluster; import org.apache.kafka.common.Node; import org.apache.kafka.common.PartitionInfo; import org.apache.kafka.common.header.internals.RecordHeader; import org.apache.kafka.common.serialization.StringSerializer; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Properties; /** * 生产者/消费者 * * @author Mobai * @className KafkaPCUtils * @description 描述 * @date 2024/6/7 10:14 */ @Log4j2 @Service public class KafkaPCUtils { public void sendCallbackOneMessage(String topic, Vehicle vehicle) { String vin = vehicle.getVin(); String vehicleString = JSON.toJSONString(vehicle); log.info("向主题:[{}],发送消息:{}", topic, vehicle); String bootstrapServers = "127.0.0.1:9092"; // 设置生产者属性 Properties properties = new Properties(); properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); // properties.setProperty(ProducerConfig.PARTITIONER_CLASS_CONFIG, CustomizePartitioner.class.getName()); // 创建生产者 KafkaProducer producer = new KafkaProducer<>(properties); // 创建分区 AdminClient adminClient = AdminClient.create(properties); CreatePartitionsResult partitions = adminClient.createPartitions(new HashMap() {{ put(topic, NewPartitions.increaseTo(8, null)); }}); // 节点集合 List list = new ArrayList<>(); list.add(new Node(0, "127.0.0.1", 9092)); // 节点分区列表 List partitionInfos = new ArrayList<>(); for (int i = 0; i < 8; i++) { partitionInfos.add(new PartitionInfo(topic,i,null,null,null)); } int partition = new CustomizePartitioner().partition( topic, vin, vin.getBytes(), vehicleString, vehicleString.getBytes(), new Cluster("iYl5vA6ESGaoH5veXYGroQ", list, partitionInfos, null, null) ); log.info("当前获取分区:[{}]",partition); // 创建消息 主题 key 分区 值 ProducerRecord record = new ProducerRecord<>(topic, vin, vehicleString); record.headers().add(new RecordHeader("type", "String".getBytes(StandardCharsets.UTF_8))); // 发送消息 有回执 producer.send(record, (matadata, exception) -> { if (exception == null) { // int partition = matadata.partition(); log.info("消息发送成功,topic:[{}],分区为:[{}]", topic, partition); } else { log.info("消息发送失败,topic:[{}],异常信息:[{}]", topic, exception.getMessage()); } }); // 关闭生产者 producer.close(); } //监听消费 @KafkaListener(topics = {"topic0", "topic1"}) public void onNormalMessage1(ConsumerRecord record) { String value = (String) record.value(); JSON.parseObject(value, Vehicle.class); System.out.println("简单消费:" + record.topic() + "-" + record.partition() + "=" + record.value()); } // //批量消费 // @KafkaListener(id = "consumer2", topics = {"topic1"}, groupId = "sb_group") // public void onBatchMessage(List> records) { // System.out.println(">>> 批量消费一次,recoreds.size()=" + records.size()); // for (ConsumerRecord record : records) { // System.out.println(record.value()); // } // } }