【问题标题】:Purge a queue in RabbitMQ清除 RabbitMQ 中的队列
【发布时间】:2017-01-30 10:08:34
【问题描述】:

我正在使用 RabbitMQ 进行日常交易。我的消费者是部署在多台机器上的 .Net 桌面应用程序。每天,事务仅在特定时间段内被推送到队列中。除此之外,任何新交易都需要硬停止。我已经设法停止向队列发送新事务。但是,队列中的现有事务也需要刷新,以便不会发送给任何消费者。 我尝试搜索此内容,但除了两个选项外,没有找到任何清除队列的解决方案-

  • 每天删除并重新创建队列
  • 停止队列的所有消费者

这两种方法都可以实现,但需要对我的系统进行大量更改。我想知道是否有更好的方法。

【问题讨论】:

  • 您是否尝试过使用此功能:rabbitmq.com/ttl.html
  • 谢谢,我会检查一下。
  • 您在rabbitmqadmin 中有一个功能可以清除队列,rabbitmqadmin purge queue name=queue_name。尽管这不会在您的代码库中复杂地完成,但这意味着您不需要删除队列或停止消费者。
  • @PärEriksson 是的,我查过了。我需要以某种方式在 C# 中执行此操作。
  • @SouvikGhosh 啊哈好吧。我希望您正在使用的 AMQP 驱动程序存在yourQueue.purge()。调用此函数的计划任务(不确定 C# 生态系统中存在什么)会是一个解决方案吗?

标签: c# rabbitmq


【解决方案1】:

在 C# 中,您可以像这样清除队列

            ConnectionFactory factory = new ConnectionFactory();

            factory.HostName = "localhost";
            factory.UserName = "guest";
            factory.Password = "guest";

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueuePurge(queueName);
                }

            }

【讨论】:

    【解决方案2】:

    blog article 描述了如何以不同方式清除 RabbitMQ 中的队列。

    rabbitmqadmin: 管理插件附带一个命令行工具 rabbitmqadmin,它可以执行与基于 Web 的 UI(RabbitMQ 管理界面)相同的操作。

    用于清除单个队列中所有消息的脚本是:

    $ rabbitmqadmin purge queue name=name_of_queue
    

    HTTP API: Rabbitmq 管理插件提供了一个基于 HTTP 的 API,用于管理和监控您的 RabbitMQ 服务器。

    curl -i -XDELETE https://USERNAME:PASSWORD@HOST/api/queues/vhost/QUEUE_NAME/contents
    

    政策: 添加将队列名称与最大长度规则匹配的策略。可以通过进入管理界面然后按管理选项卡来添加策略。 (不要忘记在应用后将其删除。)

    【讨论】:

    • 对不起,我没有 RabbitMQAdmin,所以必须通过代码来完成。
    【解决方案3】:

    另一种选择是使用 HareDu 2 Broker API 和以下代码。文档在这里: https://github.com/ahives/HareDu2

    var result = _container.Resolve<IBrokerObjectFactory>()
                    .Object<Queue>()
                    .Empty(x =>
                    {
                        x.Queue("your_queue");
                        x.Targeting(t => t.VirtualHost("your_vhost"));
                    });
    

    【讨论】:

      【解决方案4】:

      更具体的,来自HTTP API:http 动词 DELETE on /api/queues/vhost/name/contents

      引用:“队列的内容。删除以清除。请注意,您无法获取此内容。”

      【讨论】:

        【解决方案5】:

        根据 Andy Skirrow 的建议(在 cmets 中),我在将每条消息发布到 JSON 有效负载中的 RabbitMQ 之前为每条消息设置了“过期时间”。

        我的代码-

        using (System.Net.WebClient client = new System.Net.WebClient())
        {
            client.Credentials = new System.Net.NetworkCredential(rmq_user, rmq_pass);
            client.Headers.Set("Content-Type", "application/json");
            response = client.UploadString(messagePath, jsonPayload);
        }
        

        这是我的有效载荷-

        {"payload":"{\"PerformAutomation\":{\"AutomationInputDictionary\":{\"Search.Ban\":\"Holidays from=10th Mar 2017;Holidays to=13th Mar 2017;WalmartID=00155628;ticket_number=1226004;TicketType=HOLIDAY REQUEST;RawTicketData=PERN: 00155628\\r\\nHoliday Request -------------------- Holiday from 10th Mar 2017 to 13th Mar 2017\"},\"ProcessName\":\"HRProc\",\"ProfileName\":\"HR\",\"APIVersion\":\"\",\"AppId\":\"\",\"CommandExecutionWindow\":\"\",\"CommandGenerationSource\":\"\",\"Country\":\"\",\"Instance\":\"\",\"PartnerId\":\"\",\"ReferenceCode\":\"\",\"Timestamp\":\"5:07 AM\",\"UserName\":\"svcblpr\",\"VID\":\"\"}}","content_type":"string","content_encoding":"test/json","profile":"HR","expiration":604800000,"app_id":"wm_uc1_load_gen_app","source_message_id":"wm_uc1_load_gen_source","header":null}
        

        因此,通过此解决方法,我不必清除队列,因为消息将根据有效负载中设置的过期时间(毫秒值)自动删除。

        【讨论】:

          【解决方案6】:

          如果它必须是这两种方法之一,并且您 need to do this in C# somehow 如您在 cmets 中所说,那么只需 use the HTTP API。在该页面上搜索/api/queues/vhost/name/contents,这就是您调用删除方法的地方。

          【讨论】:

          • 我猜那会删除队列?
          • 是的。我没有粘贴正确的路径 - 最后缺少contents。我会编辑答案
          • 山地旅行者也将此信息作为对我的回答的回答
          【解决方案7】:

          如果你想清除非零值队列,使用这个:

          sudo rabbitmqctl list_queues| awk '{if($2 > 0) 打印 $1;}'| xargs -t -n1 sudo rabbitmqctl purge_queue

          当然,您可以自定义为所有队列执行此操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-13
            • 1970-01-01
            • 2017-01-17
            • 2017-12-27
            • 1970-01-01
            • 1970-01-01
            • 2015-05-06
            • 2014-09-26
            相关资源
            最近更新 更多