rabbitmq 事物回滚后,再次发送消息失败

下面是关于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());
        }
    }
}
        
        
阅读 3.4k
1 个回答

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题