第一种方式在上篇博文中。
1、用插件 a、安装和使用第二种方式就是使用插件:rabbitmq_delayed_message_exchange
首先我们需要下载 rabbitmq_delayed_message_exchange 插件,这是一个 GitHub 上的开源项目,我
们直接下载即可:
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
选择适合自己的版本,我这里选择最新的 3.9.0 版。
下载完成后在命令行执行如下命令将下载文件拷贝到 Docker 容器中去:
docker cp ./rabbitmq_delayed_message_exchange-3.9.0.ez some-rabbit:/plugins
这里第一个参数是宿主机上的文件地址,第二个参数是拷贝到容器的位置。
接下来再执行如下命令进入到 RabbitMQ 容器中:
docker exec -it some-rabbit /bin/bash
进入到容器之后,执行如下命令启用插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
启用成功之后,还可以通过如下命令查看所有安装的插件,看看是否有我们刚刚安装过的插件,如下:
rabbitmq-plugins list
有 E* 的就是安装的了
消费者:
接口:
效果:
可以看到,刚好 5 秒。
只要确保消息到达队列了就算消息发送成功了。因为队列之后的事情不归我们管,是消费者的事情。
1、 确保消费成功的两种思路如何确保消息成功到达 RabbitMQ?RabbitMQ 给出了两种方案:
- 开启事务机制发送方确认机制
这是两种不同的方案,不可以同时开启,只能选择其中之一,如果两者同时开启,则会报如下错误:
首先需要配置一个事务管理器, 发消息的时候配置一个事务就行。如果这个代码里面出错的话,就会回滚。通过加事务的方式确保这个消息发送成功。
a、代码实现消息发送:
接口:
在消息发送那一块,通过加注解的方式开启事务,可以自行尝试故意出错,如果出错了这个消息会自动回滚。
消息发送使用了 @Transactional 注解,跟使用 mysql 的时候一样,因为 Spring 已经把事务的用法统一起来了。规则都是一样的。
b、为什么不选择事务方式为什么事务模式了解就行呢?因为开启事务后会多了四个步骤:
再次强调,这种方式跟上面的事务方式不能共存,同时开启会报错:
首先是 config 配置文件,先去掉事务管理:
其他都不变,再加点东西:
发送消息:
到这里代码就搞完了。
可以自行测试 交换机出问题或者队列出问题。比如直接注释掉交换机就行(在 send 方法里注释)。
4、自带的重试机制失败重试分两种情况,一种是压根没找到 MQ 导致的失败重试(一般是没启动 MQ,或者网络问题)。
另一种是找到 MQ 了,但是消息发送失败了。
不仅是 MQ,其他地方也可使用。
b、业务重试
具体的业务重试看下一章!
未完待续…敬请期待
2、消费失败重试 + 幂等性处理


