2. springboot集成kafka入门使用教程

项目demo地址 : https://mp.weixin.qq.com/s?__biz=MzkzODQyNzE3

1. 项目结构

复制代码
 ─src
    ├─main
    │  ├─java
    │  │  └─org
    │  │      └─example
    │  │          │  KafkaApplication.java
    │  │          │
    │  │          └─demo
    │  │                  KafkaConsumerListener.java (监听消息类)
    │  │
    │  └─resources
    │          application.yml
    │
    └─test
        └─java
            └─org
                └─example
                    └─demo
                            KafkaProducerTest.java (发送消息测试类)

2. kafka依赖

复制代码
<!--kafka-->
<dependency>
  <groupId>org.springframework.kafka</groupId>
  <artifactId>spring-kafka</artifactId>
  <version>${kafka.version}</version>
</dependency>

3. 消息的发送

3.1 同步发送

同步发送是指发送消息后等待Kafka的响应,确认消息已成功发送。这个方式的优点在于可靠性高,但缺点是会阻塞当前线程,影响系统的响应速度。

复制代码
    /**
     * 同步发送
     */
    @Test
    public void synchronizeSend() {
        Map<String, Object> map = new HashMap<>();
        map.put("say", "你好, kafka........");
        ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send(TOPIC, JSONObject.toJSONString(map));
        try {
            SendResult<String, String> result = future.get();
            log.info("获取同步消息结果:{}", result.getRecordMetadata().topic());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
3.2 异步发送

异步发送是指发送消息后立即返回,不等待Kafka的响应,而是通过回调函数处理发送结果。这种方式不会阻塞线程,更适合高并发的场景。

复制代码
@Test
public void asynchronousSend() {
    Map<String, Object> map = new HashMap<>();
    map.put("say", "你好, kafka........");
    kafkaTemplate.send(TOPIC, JSONObject.toJSONString(map)).addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
        @Override
        public void onFailure(Throwable ex) {
            log.error("发送失败:{}", ex.getMessage());
        }

        @Override
        public void onSuccess(SendResult<String, String> result) {
            log.info("异步消息结果:{}", result.getRecordMetadata().topic());
        }
    });
}
3.3 kafka事务

Kafka事务确保一组消息要么全部成功,要么全部失败,用于实现消息的原子性。适用于需要保证一致性的场景,例如订单处理。

复制代码
@Test
public void transaction() {
    kafkaTemplate.executeInTransaction(t -> {
        t.send(TOPIC, "kafka事务消息...");
        if (true) {
            throw new RuntimeException("发生异常kafka回滚事务");
        }
        t.send(TOPIC, "你好, kafka........");
        return true;
    });
}

注意 :

如果想使用kafka事务需要在配置文件中开启事务

复制代码
# 开启事务
transaction-id-prefix: tx_

开启事务后, 同步/异步发送消息都需要加@Transactional注解

4. 消息的接收

Kafka消息的接收是通过监听器实现的。监听器会自动接收指定主题的消息,并处理接收到的消息。以下是一个简单的示例:

复制代码
/**
 * 监听kafka数据
 */
@KafkaListener(topics = {"test-topic"})
public void consumer(ConsumerRecord<?, ?> consumerRecord) {
    log.info("监听kafka消息>>>>>>>>>>>>>>>>>主题topic={}, 分区offset={}, 信息message={}", consumerRecord.topic(), consumerRecord.offset(), consumerRecord.value());
    // 收到监听数据后面可以进行入库等业务操作
}

原文地址(阅读体验更佳) : 2. springboot集成kafka入门使用教程 (yuque.com)

相关推荐
凤山老林4 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne5 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
省钱兄--zs6 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
Dreamboat-L8 小时前
日志级别基础 + Spring Boot 日志实践指南
java·服务器·数据库·java-ee·springboot
ab1237688 小时前
Spring WebSocket(STOMP)
笔记·websocket·springboot·stomp
silvamux_9 小时前
Spring Boot 调用大模型 api 最小可跑教程
java·spring boot·后端
今年下半年9 小时前
【Spring Boot 】通过 OpenFeign 请求第三方接口
java·spring boot·后端·openfeign
三翼鸟数字化技术团队9 小时前
Springboot + WebFlux + Disruptor 实现数据转发
java·spring boot
今年下半年11 小时前
【短信发送】Spring Boot整合多种短信接口的实现(附源码)
java·spring boot·后端·sms·qcloudsms
ly768912 小时前
PostgreSQL JSONB 在 Spring Boot 中的读写边界:从 JDBC 类型映射到 GIN 索引失效
spring boot·postgresql·gin·jsonb·pgjdbc·gin 索引