开始

alt+回车 实现这个接口
image.png
image.png
会自动起个名字,这个时候我们选择ok就可以了
image.png
选择全部的方法
image.png
会把所有的方法都实现
image.png
为什么不直接写方法,反而要实现接口的形式呢?因为我们的底层可能要换。换成redis等,这样我们把impl实现类换掉就可以了。
甚至可以写多个实现,通过配置来使用哪个实现。是使用数据库的实现,还是redis的实现。

首先注入dao层。
image.png

image.png
把数量改成数字类型
image.png
枚举不能应用于这个PO
image.png
改成这样
image.png
这里也不报错了
image.png

调用dao层
image.png

发送成功,把消息删掉

image.png

消息返回后需要重新的做持久化

消息重新持久化,要和第一次保存的时候用的一个方法。
消息返回的时候,消息已经被删掉了。发送确认后消息就被删掉了。第二步就是消息有可能会被返回回来,因为这个消息没有找到可以路由的队列,这个时候消息已经不在数据库内了,所以我们加入消息重新的做持久化。就和我们第一次做持久化的内容是一样的。
image.png

应发,但是未发的消息全部找到

image.png

记录重发的次数

这个不是一个原子操作。有可能会有并发的问题,如果没个微服务是多副本的话,建议用一些分布式锁的手段。让他重发的业务不要并行跑。
比如我们的orderService只有一个副本,如果业务量大了,用了5个副本的话,他有可能同时在跑这个MessageRend方法,会把这个发送次数加的非常的多。这样就需要分布式锁或者是任务调度的机制,让同一时间只有一个副本在跑这个方法
image.png

设置消息为死了

image.png

结束