目录
配置文件
server:
port: 8080
spring:
kafka:
bootstrap-servers: xxx:9092,xxx:9093
producer:
retries: 3 #重试次数
# 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)
acks: 1
# 批量大小
batch-size: 16384
# 生产端缓冲区大小
buffer-memory: 33554432
# Kafka提供的序列化和反序列化类
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: default-group
# 当kafka中没有初始offset或offset超出范围时将自动重置offset
# earliest:重置为分区中最小的offset;
# latest:重置为分区中最新的offset(消费分区中新产生的数据);
# none:只要有一个分区不存在已提交的offset,就抛出异常;
auto-offset-reset: earliest
# 是否自动提交offset
enable-auto-commit: false
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 批量消费每次最多消费多少条消息
max-poll-records: 500
listener:
ack-mode: MANUAL_IMMEDIATE
# ack-mode: MANUAL
type: batch
完整代码
@Component
public class ConsumerController {
@KafkaListener(topics = "testGroup",groupId = "default-group")
public void listenGroup(ConsumerRecord<String, String> record, Acknowledgment ack) {
String value = record.value();
System.out.println(value);
System.out.println(record);
//手动提交offset,如果没配置相当于没有配置手动提交,消息会重复消费
ack.acknowledge();
}
}
@RestController
@RequestMapping("/msg")
public class KafkaController {
private final static String TOPIC_NAME="testGroup";
@Autowired
private KafkaTemplate<String,String> kafkaTemplate;
@RequestMapping("/send")
public String sendMessage(){
kafkaTemplate.send(TOPIC_NAME,0,"key","this is a message!");
return "send success";
}
}
消费者配置细节
目的:可以直接监听一个消费组,然后给消费组设置多个topic,并且设置里面的分区——>除此之外,可对目标主题里的分区设置offset
MANUAL_IMMEDIATE:消费者消费完消息后再提交offset
MANUAL:消费者消费一条提交一条,前者可能会丢消息