说明
创建springboot工程
https://www.malaoshi.top/show_1EF5qXjMmlZR.html
添加依赖
spring框架有对kafka的支持,添加该依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.4.1.RELEASE</version>
</dependency>
选择 2.4.12.RELEASE版本的原因:
kafka教程-Spring for Apache Kafka版本的选择
application.properties
在 resources 目录下创建 application.properties 文件
注意修改以下几处:
- 指定springboot端口号
- 指定kafka的ip、port
- 指定默认消费者组
server.port=8083
###########【Kafka集群】###########
spring.kafka.bootstrap-servers=hadoop1:9092,hadoop2:9092,hadoop3:9092
###########【初始化消费者配置】###########
# 默认的消费组ID
spring.kafka.consumer.properties.group.id=user-group
# 是否自动提交offset
spring.kafka.consumer.enable-auto-commit=true
# 提交offset延时(接收到消息后多久提交offset)
spring.kafka.consumer.auto.commit.interval.ms=1000
# 当kafka中没有初始offset或offset超出范围时将自动重置offset
# earliest:重置为分区中最小的offset。指定一个新用户组,第一次启动会拉取所有的数据,记住offset。再次启动是从offset位置拉取数据
# latest:重置为分区中最新的offset(消费分区中新产生的数据)。指定一个新用户组,第一次启动,指向最新的offset不会拉取数据
# none:只要有一个分区不存在已提交的offset,就抛出异常;
spring.kafka.consumer.auto-offset-reset=earliest
# 消费会话超时时间(超过这个时间consumer没有发送心跳,就会触发rebalance操作)
spring.kafka.consumer.properties.session.timeout.ms=120000
# 消费请求超时时间
spring.kafka.consumer.properties.request.timeout.ms=180000
# Kafka提供的序列化和反序列化类
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
# 消费端监听的topic不存在时,项目启动会报错(关掉)
spring.kafka.listener.missing-topics-fatal=false
# 设置批量消费
# spring.kafka.listener.type=batch
# 批量消费每次最多消费多少条消息
# spring.kafka.consumer.max-poll-records=50
消费者类
当有消息时,会自动执行 onMessage() 方法
package com.std.kafka;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class KafkaConsumer {
// 消费监听
@KafkaListener(topics = "userlog")
public void onMessage(ConsumerRecord<?, ?> record) {
//获取消费者组
String groupId=KafkaUtils.getConsumerGroupId();
// 消费的哪个topic、partition的消息,打印出消息内容
System.out.println("简单消费:" +groupId+"-"+ record.topic() + "-" + record.partition() + "-" + record.value());
}
}
另一种写法
注意:不要同时定义多个接收方法
@KafkaListener(topics = {"userlog"})
public void onMessage(@Payload String message,
@Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition,
@Header(KafkaHeaders.RECEIVED_TOPIC) String topic,
@Header(KafkaHeaders.OFFSET) String offset) {
// 消费的哪个topic、partition的消息,打印出消息内容
System.out.println(String.format("消费:topic:%s-partition:%s-offset:%s-value:%s", topic,partition,offset,message));
}
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
}
kafka准备
启动 zookeeper 服务
见 链接
启动 kafka 服务
见 链接
创建主题
bin/kafka-topics.sh --bootstrap-server hadoop1:9092 --create --topic userlog
启动消费者
cd /program/kafka_2.12-2.4.1
bin/kafka-console-consumer.sh --bootstrap-server hadoop1:9092 --topic userlog
测试
启动消费者springboot工程
启动生产者springboot工程
访问 http://localhost:8081/kafka/test-msg ,通过Controller向kafka发送消息
在消费者springboot工程的控制台中,可以收到消息
