一、先扔一张图
说明:
本文涵盖了关于RabbitMQ很多方面的知识点, 如:
-
消息发送确认机制
-
消费确认机制
-
消息的重新投递
-
消费幂等性, 等等
这些都是围绕上面那张整体流程图展开的, 所以有必要先贴出来, 见图知意
二、实现思路
-
简略介绍163邮箱授权码的获取
-
编写发送邮件工具类
-
编写RabbitMQ配置文件
-
生产者发起调用
-
消费者发送邮件
-
定时任务定时拉取投递失败的消息, 重新投递
-
各种异常情况的测试验证
-
拓展: 使用动态代理实现消费端幂等性验证和消息确认(ack)
三、项目介绍
-
Spring Boot
版本2.1.5.RELEASE
, 旧版本可能有些配置属性不能使用, 需要以代码形式进行配置 -
RabbitMQ
版本3.7.15
-
MailUtil
: 发送邮件工具类 -
RabbitConfig
: rabbitmq相关配置 -
TestServiceImpl
: 生产者, 发送消息 -
MailConsumer
: 消费者, 消费消息, 发送邮件 -
ResendMsg
: 定时任务, 重新投递发送失败的消息
说明: 上面是核心代码,
MsgLogService mapper xml
等均未贴出, 完整代码可以参考我的GitHub, 欢迎fork, https://github.com/wangzaiplus/springboot/tree/wxw
四、代码实现
163邮箱授权码的获取, 如图:
该授权码就是配置文件spring.mail.password
需要的密码
2. pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3. rabbitmq
、邮箱配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
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. 表结构
CREATE TABLE `msg_log` (
`msg_id` varchar(255) NOT NULL DEFAULT '' COMMENT '消息唯一标识',
`msg` text COMMENT '消息体, json格式化',
`exchange` varchar(255) NOT NULL DEFAULT '' COMMENT '交换机&