springboot集成rabbitmq,异步发送邮件功能实现

1.配置qq邮箱的账号、密码;配置rabbitmq的ip、用户名、密码


qq邮箱配置


rabbitmq配置

2.声明队列、交换机、让队列绑定交换机,并且携带路由key(用的是路由模式)

设置消息和交换机持久性,是为了防止消息丢失

队列交换机绑定

3.为了保证生产者不丢失消息,需要让生产者确认消息

消息有一个唯一的消息id,mq收到消息后,会返回一个结果给发送者,表示消息处理成功

返回的结果有两种方式

a.发送者确认:消息没有投递到交换机,则返回ack,反之则返回nack

b.发送者回执:消息到交换机了,但是没有路由到队列,则返回ack,以及路由失败的原因。


发送者确认和发送者回执


消息投递成功后,调用updateMailSendLogStatus方法,修改消息数据库消息表中等于msgId的记录的状态字段(status等于1代表消息发送成功)

调用发送者确认和发送者回执方法


消息表

4.录入用户信息后,生成唯一的msgId,并且将消息发送给消费者


消息发送代码

5.消费者接收消息,开启手动确认模式,返回消息给生产者

使用redis,查询redis缓存是否存在msgId,如果存在直接将该消息标记为已消费(先判断redis是否存在msgId是为了避免消息重复消费,保证了接口的幂等性。channel.basicAck(tag, false):标记该消息已经成功消费了),否则,发送邮件(发送邮件即消费消息)

使用redis,避免消息重复消费

6.redis不存在msgId,则消费该消息

如果redis不存在msgId,说明消息没有被消费过,则可以消费消息。发送完邮件后,将msgId存入到redis中,下次同样的消息来后,就不会被消费。

消费消息

7.消费失败重试机制

使用Quartz定时任务框架,定时扫描数据库消息表中,状态等于0的记录(状态等于0代表消息投递中,消息者还没有消费到消息),对这些记录进行遍历,并判断记录中重试次数:count是否大于3,小于等于3,则再次对消息发送;反之,重试次数大于3,则将数据库这条记录的状态直接设置为:消息投递失败。

消费失败重试

总结:

消息可靠性保证:

1.发送者确认和发送者回执

2.消息和队列持久化

3.消费者失败重置

展开阅读全文

页面更新:2024-04-23

标签:回执   生产者   队列   路由   绑定   交换机   消费者   状态   消息   功能   数据库

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top