115 lines
4.5 KiB
Java
115 lines
4.5 KiB
Java
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<String, String> producer = new KafkaProducer<>(properties);
|
||
// 创建分区
|
||
AdminClient adminClient = AdminClient.create(properties);
|
||
CreatePartitionsResult partitions = adminClient.createPartitions(new HashMap() {{
|
||
put(topic, NewPartitions.increaseTo(8, null));
|
||
}});
|
||
// 节点集合
|
||
List<Node> list = new ArrayList<>();
|
||
list.add(new Node(0, "127.0.0.1", 9092));
|
||
// 节点分区列表
|
||
List<PartitionInfo> 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<String, String> 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<String, Object> 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<ConsumerRecord<String, Object>> records) {
|
||
// System.out.println(">>> 批量消费一次,recoreds.size()=" + records.size());
|
||
// for (ConsumerRecord<String, Object> record : records) {
|
||
// System.out.println(record.value());
|
||
// }
|
||
// }
|
||
|
||
}
|