RabbitMQ 高级特性之事务
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 队列中没有消息存在。