【问题标题】:RabbitMQ transactions are commiting without exceptions while queue is down队列关闭时,RabbitMQ 事务正在无异常地提交
【发布时间】:2018-07-04 19:37:56
【问题描述】:

我正在尝试通过事务将消息从发布者同步发送到代理,如 here 所述(使用 Tx 保证交付),以确保从发布者到代理的消息传递。

所以我向代理发送消息。

        try
        {
            var factory = new ConnectionFactory() {HostName = "localhost"};
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: routingKey, durable: true, exclusive: false, autoDelete: false, arguments: null);

                var properties = channel.CreateBasicProperties();
                properties.Persistent = true;

                channel.TxSelect();
                for (int i = 0; i < 10; i++)
                {
                    channel.BasicPublish("", routingKey, properties, Encoding.UTF8.GetBytes("nop"));
                    channel.TxCommit();
                }
            }
        }
        catch (Exception ex)
        {
            //handle exception
            Console.WriteLine(ex);
        }

我期望消息将被传递给代理并持久化到队列中。否则如果出现问题就会出现异常。

但是当我在发布消息时删除队列时,什么也没有发生。

为什么事务无异常提交?

【问题讨论】:

    标签: c# rabbitmq publish-subscribe


    【解决方案1】:

    从引用的代码和文章中,我看不出它会在哪里出现异常。

    对于例外情况,您需要 TxSelect 来处理某些内容。但是,由于您不会在队列中获得任何新内容,因此它不会有任何工作要做。因此也不例外。 另一方面,我猜发布只是给你任务,这是一个承诺,每个你的代码似乎只是保持未处理。再次 - 也不例外。

    我建议在不创建队列的情况下做同样的事情。 肯定也不例外。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      你检查 TxCommit 的返回值吗?

      https://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.0/rabbitmq-java-client-javadoc-1.7.0/com/rabbitmq/client/Channel.html#txCommit()

      返回: 指示事务已成功提交的事务提交方法

      【讨论】:

      • 是的,是java实现。对于 C#,它是无效的。
      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 2014-05-09
      • 1970-01-01
      • 2015-03-15
      • 2020-05-11
      • 2021-12-28
      • 1970-01-01
      • 2014-08-03
      相关资源
      最近更新 更多