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)

相关推荐
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社23 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理3 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码3 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot
Code blocks5 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
亲爱的非洲野猪7 小时前
Kafka消息积压的多维度解决方案:超越简单扩容的完整策略
java·分布式·中间件·kafka
全干engineer11 小时前
Spring Boot 实现主表+明细表 Excel 导出(EasyPOI 实战)
java·spring boot·后端·excel·easypoi·excel导出
a_Dragon111 小时前
Spring Boot多环境开发-Profiles
java·spring boot·后端·intellij-idea
ChinaRainbowSea11 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
亲爱的非洲野猪12 小时前
Kafka “假死“现象深度解析与解决方案
分布式·kafka