springboot 整合 kafka
配置项:
spring.kafka.consumer.bootstrap-servers=*******
spring.kafka.consumer.group-id=*********
生产端:
@Component
@Slf4j
public class MyKafkaProducer {
@Value("${spring.kafka.consumer.bootstrap-servers}")
private String bootstrapServers;
private KafkaProducer<String, String> batchMyKafkaProducer;
public MyKafkaProducer() {
}
public void setBootstrapServers(String bootstrapServers) {
this.bootstrapServers = bootstrapServers;
}
@PostConstruct
public void init() {
Properties props = new Properties();
//设置接入点,即控制台的实例详情页面显示的“默认接入点”。
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, this.bootstrapServers);
//接入协议。
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "PLAINTEXT");
//Kafka消息的序列化方式。
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
//请求的最长等待时间。
props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 30 * 1000);
if (this.batchMyKafkaProducer == null) {
this.batchMyKafkaProducer = new KafkaProducer<String, String>(props);
}
}
@PreDestroy
public void stop() {
if (this.batchMyKafkaProducer != null) {
this.batchMyKafkaProducer.close();
}
}
public void asynPushRecord(ProducerRecord<String, String> record) {
try {
//发送消息,并获得一个Future对象。
Future<RecordMetadata> metadataFuture = this.batchMyKafkaProducer.send(record);
//同步获得Future对象的结果。
RecordMetadata recordMetadata = metadataFuture.get();
System.out.println("Produce ok:" + recordMetadata.toString());
} catch (Exception e) {
//要考虑重试。
System.out.println("error occurred");
e.printStackTrace();
}
}
}
发消息:
ProducerRecord<String, String> kafkaMessage = new ProducerRecord<String, String>("dome03", "消息体");
myKafkaProducer.asynPushRecord(kafkaMessage);
消费端:
@Component
@EnableKafka
public class MyKafkaListenerTest {
@KafkaListener(topics = "dome03",concurrency = "1")
public void processMessage(String content) {
System.out.println(content);
}
}