【Rabbitmq篇】高级特性----事务,消息分发

【Rabbitmq篇】高级特性----事务,消息分发

目录

事务

消息分发 

应用场景

 1. 限流

2.负载均衡 

事务

RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制.SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,要么全部成功,要么全部失败.

何为原子性(面试重点)?

例如: 当A向B转账1000元,会经历俩个步骤

1.A 向 B 转账 1000元 A的账号将会减去1000元

2.B将会收到1000元 B的账号将会增加1000元

可是,如果遇到极端情况,当A向B转账1000元时,A-1000元已完成,这个时候系统出现故障,导致A-1000 但是B却没有接收到 那么1000元将无缘无故丢失了 ,肯定不会允许这种事情发生,不然谁还敢转账。

此时就是将1操作和2操作绑定在一起,要么同时完成,要么一个都不执行

当出现1执行失败的时候,将1操作进行“回滚”,回到原来的状态,就当一切都没发生过

接下来实现rabbitmq的事务

声明队列:

    //事务
    public static final String TRANS_QUEUE = "trans_queue";

    @Bean("transQueue")
    public Queue transQueue() {
        return QueueBuilder.durable(Constants.TRANS_QUEUE).build();
    }

 配置事务管理器:

    @Bean
    public RabbitTransactionManager rabbitTransactionManager(ConnectionFactory connectionFactory) {
        return new RabbitTransactionManager(connectionFactory);
    }
    @Bean("transRabbitTemple")
    public RabbitTemplate transRabbitTemple(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        //开启事务
        rabbitTemplate.setChannelTransacted(true);
        return  rabbitTemplate;
    }

生产者代码编写:

    @RequestMapping("/trans")
    public String trans() {
        System.out.println("trans test...");
        transRabbitTemplate1.convertAndSend(Constants.TRANS_EXCHANGE, "trans", "trans test 1...");
        int num = 5/0;
        transRabbitTemplate1.convertAndSend(Constants.TRANS_EXCHANGE, "trans", "trans test 2...");
        return "消息发送成功";
    }

测试:

1)不带 @Transactional 带异常的发送 看看会发生什么?

 

转载请说明出处内容投诉
CSS教程网 » 【Rabbitmq篇】高级特性----事务,消息分发

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买