实战 | SpringBoot+RabbitMQ ,保证消息100%投递成功并被消费(附源码)

一、先扔一张图

说明:

本文涵盖了关于RabbitMQ很多方面的知识点, 如:

消息发送确认机制

消费确认机制

消息的重新投递

消费幂等性, 等等

这些都是围绕上面那张整体流程图展开的, 所以有必要先贴出来, 见图知意

二、实现思路

简略介绍163邮箱授权码的获取

编写发送邮件工具类

编写RabbitMQ配置文件

生产者发起调用

消费者发送邮件

定时任务定时拉取投递失败的消息, 重新投递

各种异常情况的测试验证

拓展: 使用动态代理实现消费端幂等性验证和消息确认(ack)

三、项目介绍

springboot版本2.1.5.RELEASE, 旧版本可能有些配置属性不能使用, 需要以代码形式进行配置

RabbitMQ版本3.7.15

MailUtil: 发送邮件工具类

RabbitConfig: rabbitmq相关配置

TestServiceImpl: 生产者, 发送消息

MailConsumer: 消费者, 消费消息, 发送邮件

ResendMsg: 定时任务, 重新投递发送失败的消息

说明: 上面是核心代码, MsgLogService mapper xml等均未贴出, 完整代码可以参考GitHub上的源码,地址在文末。

四、代码实现

1、163邮箱授权码的获取, 如图:

该授权码就是配置文件spring.mail.password需要的密码

2、pom

<!--mq-->

org.springframework.boot

spring-boot-starter-amqp

<!--mail-->

org.springframework.boot

spring-boot-starter-mail

3、rabbitmq、邮箱配置

# rabbitmq

spring.rabbitmq.host=localhost

spring.rabbitmq.port=5672

spring.rabbitmq.username=guest

spring.rabbitmq.password=guest

# 开启confirms回调 P -> Exchange

spring.rabbitmq.publisher-confirms=true

# 开启returnedMessage回调 Exchange -> Queue

spring.rabbitmq.publisher-returns=true

# 设置手动确认(ack) Queue -> C

spring.rabbitmq.listener.simple.acknowledge-mode=manual

spring.rabbitmq.listener.simple.prefetch=100

# mail

spring.mail.host=smtp.163.com

spring.mail.username=18621142249@163.com

spring.mail.password=123456wangzai

spring.mail.from=18621142249@163.com

spring.mail.properties.mail.smtp.auth=true

spring.mail.properties.mail.smtp.starttls.enable=true

spring.mail.properties.mail.smtp.starttls.required=true

说明: password即授权码, username和from要一致

4、表结构

CREATETABLE`msg_log`(

`msg_id`varchar(255)NOTNULLDEFAULT''COMMENT'消息唯一标识',

`msg`textCOMMENT'消息体, json格式化',

`exchange`varchar(255)NOTNULLDEFAULT''COMMENT'交换机',

`routing_key`varchar(255)NOTNULLDEFAULT''COMMENT'路由键',

`status`int(11)NOTNULLDEFAULT'0'COMMENT'状态: 0投递中 1投递成功 2投递失败 3已消费',

`try_count`int(11)NOTNULLDEFAULT'0'COMMENT'重试次数',

`next_try_time`datetimeDEFAULTNULLCOMMENT'下一次重试时间',

`create_time`datetimeDEFAULTNULLCOMMENT'创建时间',

`update_time`datetimeDEFAULTNULLCOMMENT'更新时间'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农老K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值