目录

RabbitMQ事务

【RabbitMQ】事务

https://i-blog.csdnimg.cn/direct/b4f797cab9214a94a65a0f724752aefd.gif#pic_center

RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.

SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败.

配置事务管理器


@Configuration
public class RabbitTemplateConfig {
   

    //事务
    @Bean("transRabbitTemplate")
    public RabbitTemplate transRabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        //设置setChannelTransacted为true
        rabbitTemplate.setChannelTransacted(true);  
        return rabbitTemplate;
    }

    //配置事务管理器
    @Bean
    public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory){
        return new RabbitTransactionManager(connectionFactory);
    }



}

声明队列

@Configuration
public class RabbitMQConfig {
    @Bean("transQueue")
    public Queue transQueue(){
        return QueueBuilder.durable(Constant.TRANS_QUEUE).build();
    }
}

生产者代码

@RestController
@RequestMapping("/producer")
public class ProducerController {

    @Resource(name = "transRabbitTemplate")
    private RabbitTemplate transRabbitTemplate;

    @Transactional
    @RequestMapping("/trans")
    public String trans(){
        //1. rabbitTemplate.setChannelTransacted(true);设置事务属性为true
        //2. 开启@Transactional注解
        //3. RabbitTransactionManager
        System.out.println("trans test...");
        transRabbitTemplate.convertAndSend("",Constant.TRANS_QUEUE, "trans test 1...");
        int num = 5/0;
        transRabbitTemplate.convertAndSend("",Constant.TRANS_QUEUE, "trans test 2...");
        return "消息发送成功";
    }
    
}

测试

下面基于我们编写的代码来进行一下简单的测试

@Transactional 注解和不加 @Transactional 注解

https://i-blog.csdnimg.cn/direct/6c67fb55de864a7590d9f11cc4b6b6c4.png

我们先把注解屏蔽掉调用接口

https://i-blog.csdnimg.cn/direct/c9472cbe1d1647249850cb76bbede4eb.png

此时再看看我们RabbitMQ的管理界面,可以看到第一条消息发送成功了

https://i-blog.csdnimg.cn/direct/e106fa2f9b2c43689da0a43501825633.png

把消息删掉再加上 @Transactional 注解,再调用接口

https://i-blog.csdnimg.cn/direct/b8f7a4f49d384d56825ab27e0828ee6b.png

https://i-blog.csdnimg.cn/direct/73e285b838884ae69c717160d540161d.png

可以看到此时我们的队列里就不会收到消息了

https://i-blog.csdnimg.cn/direct/2383740149f24f729c3b559eb289b392.png


https://i-blog.csdnimg.cn/direct/c3c5cb1431fe43d782b362eccabd41b4.gif#pic_center