计算机系统应用教程网站

网站首页 > 技术文章 正文

SpringBoot2.0实战(17)整合RabbitMQ之ACK消息确认

btikc 2024-10-17 08:45:39 技术文章 6 ℃ 0 评论


相关知识

交换器

目标

整合 Spring boot 提供的 spring-boot-starter-amqp,实现消息发送、消息消费、确认

准备工作

安装RabbitMQ

介绍使用 Docker 方式安装,Docker 安装可以参考 https://blog.csdn.net/gongm24/article/details/86357866

下载镜像

docker pull rabbitmq:managementv

运行镜像

设置默认用户名及密码

docker run --name rabbitmq \

-p 15672:15672 \

-p 5672:5672 \

-e RABBITMQ_DEFAULT_USER=admin \

-e RABBITMQ_DEFAULT_PASS=admin \

-d rabbitmq:management

登录管理界面

访问地址: http://[宿主机IP]:15672,使用用户名密码 admin/admin 进行登录

操作步骤

添加依赖

引入 Spring Boot Starter 父工程

添加 spring-boot-starter-amqp 的依赖

添加后的整体依赖如下

配置

编码(消息发送方)

定义 Exchange、Queue并将两者进行关联

Controller 层代码

引入 spring-boot-starter-amqp 时,会自动注册 RabbitTemplate 到 Spring 容器,

消息发送可以借助其提供的 convertAndSend 方法

启动类

测试发送消息

执行测试用例,执行完成后,去 RabbitMQ 管理后台查看,

在 Exchanges 标签页中,可以看到使用的交换器 TestDirectExchange,

在 Queues 标签页中,可以看到队列 TestDirectQueue,并且 Ready 值为 1,表示有一条数据待处理

编码(消息消费方)

定义 Queue

定义消费类


启动类

测试消费消息

使用 Application 类启动项目,在日志中可以看到消费消息时产生的日志

DirectReceiver消费者收到消息 : {msgId=ccf1f1c0-f8c5-483a-933e-ed3d77d59333, msgData=null, sendTime=2020-01-07 19:50:23}

去 RabbitMQ 管理后台,查看 Queues 标签页,可以看到队列 TestDirectQueue 的 Ready 值变成了 0,表示消息已经被消费。

编码(消息消费方实现消息确认)

消息接收的确认机制主要存在三种模式:

  1. 自动确认,默认值,RabbitMQ 将消息发送给应用程序,即认为消费成功,如果应用程序在消费消息的过程中,发生异常,RabbitMQ 是无法感知的,依然会将该消息从队列中删除,但实际上应用程序又没有消费成功,相当于丢失了消息。
  2. 不确认,忽略
  3. 手动确认,实际生产多数选择的模式,应用程序接收到消息并进行处理后,返回一个响应(ACK),RabbitMQ 接收到这个响应后,判断是消费成功,还是失败,并调用相应的回调方法进行处理。

配置

设置消息消费 ACK 模式为自动模式

定义消费类

basicReject 的第二个参数是 requeue,意思是是否重新加入队列,

如果为 true,则表示本次消费不成功,并将当前消息重新加入至当前队列,

如果为 false,则表示本次消费不成功,并将当前消息丢弃,如果有设置死信队列,则会进入死信队列(关于死信队列,在下一章会讲)

源码地址

本章源码 : https://gitee.com/gongm_24/spring-boot-tutorial.git

结束语

消息队列是实际生产中是必备组件,用于保证系统高可用、高性能、可扩展

扩展

发送 Fanout 消息

定义队列

Fanout 交换器没有 Routing,直接将队列与交换器进行关联即可

发送方法

也是调用 convertAndSend 方法,只是 routing 参数传值 null

发送 Topic 消息

定义队列

发送方法

跟使用 direct 交换器一样,只是 topic 交互器会根据 routing 进行匹配,然后决定将消息发送至哪些队列


Tags:

猜你喜欢

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表