1. 簡介
與 MySQL、Redis 一樣,RabbitMQ 也支持事務。事務中的消息,要么全都發送成功,要么全部發送失敗,不會出現一部分成功一部分失敗的情況。
2. 使用事務發送消息
spring 中使用 RabbitMQ 開啟事務需要兩步:
第一步:配置 RabbitTemplate
使用下面這段代碼,將 RabbitTemplate 的?transactional 設置為 true:
@Bean("transRabbitTemplate")public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setChannelTransacted(true);return rabbitTemplate;}
第二步:在使用 @Transactional注解:
@Transactional //開啟事務@RequestMapping("/trans")public String trans() {transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 1");transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 2");int num = 3 / 0;transRabbitTemplate.convertAndSend("", Constants.TRANS_QUEUE, "trans 3");return "消息發送成功";}
在上面的代碼中,存在一處異常,當運行程序后,由于使用了事務,那么這三條消息應該都不會進入隊列中。
代碼運行結果如下:
可以看到,trans.queue 隊列中沒有消息存在。