当事务提交执行之前,由于RabbitMQ异常崩溃或其他原因抛出异常,则可以捕获异常,再执行TXRollback,完成事务回滚。
当生产者将消息发送出去后,如果不进行特殊设置,默认情况下,发送消息操作后是没有返回任何消息给生产者的,这时生产者是不知道消息有没有真的到达了RabbitMQ,消息可能在到达RabbitMQ前已经丢了。
可以将当前使用的channel设置成事务模式。借助如下与事务机制相关的三个方法来完成事务操作。
生产者发送消息到了队列,队列推送数据给了消费者,这里存在一些问题需要思考下
则说明事务提交成功,后触发了异常,时序图中发布消息前后增加了一点动作,设置信道为事务模式与提交事务。消息一定到达了RabbitMQ中。在消费端也就正常消费了。因生产者已经将消息发送到了队列中,事务模式下,如果TXCommit调用成功,实则已经和消息能不能到达队列无关了。
取消16、34和40行的注释后,在事务模式下,当再次触发异常后,能够看见,消费端并没有收到消息(这不是说消费端那边出现异常了,而是消息没有到达队列中)。发送消息与其他操作在同一事务下提供了一致性。
在原有Basic代码基础上增加事务操作,此处先注释掉与事务有关的代码(16、34和40行),并且在发送消息后设置异常模拟