一、先扔一张图

说明:
本文涵盖了关于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
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'更新时间'