项目结构
代码编写
1、pom文件
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- json -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2、yml文件
spring:
#kafka配置
kafka:
#kafka集群地址
bootstrap-servers: 你的IP地址:9092
producer:
#批量发送的数据量大小
batch-size: 16384
#可用发送数量的最大缓存
buffer-memory: 33554432
#key序列化器
key-serializer: org.apache.kafka.common.serialization.StringSerializer
#value序列化器
value-serializer: org.apache.kafka.common.serialization.StringSerializer
#达到多少时间后,会发送
properties:
linger.ms: 1
#代表集群中从节点都持久化后才认为发送成功
acks: -1
consumer:
enable-auto-commit: false
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
properties:
session.timeout.ms: 15000
3、实体类
@Data
public class KafkaRequest {
/**
* 主题
*/
private String topic;
/**
* 消息
*/
private String message;
}
4、controller
@RestController
@Slf4j
public class KafkaController {
private final String topic="lx";
private int temp=1;
@Autowired
private KafkaProducer producer;
/**
* 下单
*
* @param kafkaRequest
* @return null
*/
@RequestMapping("/test01")
public void test01(KafkaRequest kafkaRequest){
log.info("test01测试成功!topic:{};message:{}",kafkaRequest.getTopic(), kafkaRequest.getMessage());
producer.send(kafkaRequest.getTopic(), kafkaRequest.getMessage());
}
@RequestMapping("/test02")
public void test02(KafkaRequest kafkaRequest){
log.info("test02测试成功!topic:{};message:{}",topic, temp);
producer.send(topic, String.valueOf(temp));
temp++;
}
}
5、生产者
@Component
@Slf4j
public class KafkaProducer {
private HashMap map=new HashMap<>();
@Autowired
private KafkaTemplate<Integer,String> kafkaTemplate;
public void send(String topic,String msg){
log.info("开始发送消息,topic:{};message:{}",topic,msg);
ListenableFuture<SendResult<Integer,String>> send=kafkaTemplate.send(topic, msg);
//消息确认机制
send.addCallback(new ListenableFutureCallback<SendResult<Integer,String>>(){
@Override
public void onSuccess(SendResult<Integer, String> result) {
log.info("消息发送成功,topic:{};message:{}",topic,msg);
}
@Override
public void onFailure(Throwable ex) {
//落库操作
map.put(topic,msg);
}
});
}
}
6、消费者
@Component
@Slf4j
public class KafkaConsumer {
private List<String> exist=new ArrayList<>();
@KafkaListener(topics = {"lx"},groupId = "lx")
public void consumer(ConsumerRecord<Integer,String> record){
if (exist.contains(record.value())){
log.error("不满足幂等校验!!!");
}
log.info("消息消费成功,topic:{},message:{}", record.topic(), record.value());
exist.add(record.value());
}
}
测试结果
启动且连接消息队列成功:
postman测试后的控制台输出: