0

下面是关于rabbitmq事物的测试性代码, 当Integer result = 1/0抛出异常后,catch后执行txRollback,进行事物的回滚, 然后再次发送消息;

但是,发现无论是对应的交换机还是队列都没有任何变化,仿佛没有执行再次发送消息一样?

请高手指教,还有rabbitmq 中的txRollback究竟有什么作用?我是否可以在catch住后不执行txRollback

    public void learnSelect() throws IOException
    {
        //获取信道连接
        Channel channel = this.rabbitmq.getChannel();

        //交换机
        channel.exchangeDeclare("learn@select", BuiltinExchangeType.DIRECT, true, false, null);

        //队列
        channel.queueDeclare("select", true, false, false, null);

        //绑定
        channel.queueBind("select", "learn@select", "select");

        try {
            //开始事物
            channel.txSelect();

            //发布消息
            String message = " learn select message ";
            channel.basicPublish("learn@select", "select", false, MessageProperties.TEXT_PLAIN, message.getBytes());

            //模拟出现异常
            Integer result = 1/0;

            //提交事物
            channel.txCommit();
        } catch (Exception e) {
            e.printStackTrace();
            channel.txRollback();

            //发布消息
            String message = " learn select message ";
            channel.basicPublish("learn@select", "select", false, MessageProperties.TEXT_PLAIN, message.getBytes());
        }
    }
}
        
        
phplife 691
5月27日提问
1 个回答
1

rabbitmq里面的事务与数据库,spring里的事务不一样,rabbitmq的事务只为了确认消息是否到达rabbitmq,事务提交成功,消息一定到达rabbitmq,事务提交前rabbitmq崩溃,事务才回滚,rabbitmq事务非常影响性能,通常用发送方确认(publish confirm)机制代替

撰写答案

推广链接