开始
alt+回车 实现这个接口
会自动起个名字,这个时候我们选择ok就可以了
选择全部的方法
会把所有的方法都实现
为什么不直接写方法,反而要实现接口的形式呢?因为我们的底层可能要换。换成redis等,这样我们把impl实现类换掉就可以了。
甚至可以写多个实现,通过配置来使用哪个实现。是使用数据库的实现,还是redis的实现。
首先注入dao层。
把数量改成数字类型
枚举不能应用于这个PO
改成这样
这里也不报错了
调用dao层
发送成功,把消息删掉
消息返回后需要重新的做持久化
消息重新持久化,要和第一次保存的时候用的一个方法。
消息返回的时候,消息已经被删掉了。发送确认后消息就被删掉了。第二步就是消息有可能会被返回回来,因为这个消息没有找到可以路由的队列,这个时候消息已经不在数据库内了,所以我们加入消息重新的做持久化。就和我们第一次做持久化的内容是一样的。
应发,但是未发的消息全部找到
记录重发的次数
这个不是一个原子操作。有可能会有并发的问题,如果没个微服务是多副本的话,建议用一些分布式锁的手段。让他重发的业务不要并行跑。
比如我们的orderService只有一个副本,如果业务量大了,用了5个副本的话,他有可能同时在跑这个MessageRend方法,会把这个发送次数加的非常的多。这样就需要分布式锁或者是任务调度的机制,让同一时间只有一个副本在跑这个方法