在RabbitMQ中清除队列

时间:2017-01-30 10:08:34

标签: c# rabbitmq

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

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

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

7 个答案:

答案 0 :(得分:4)

在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);
                }

            }

答案 1 :(得分:2)

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

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

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

$ rabbitmqadmin purge queue name=name_of_queue

HTTP API: Rabbitmq管理插件提供基于HTTP的API,用于管理和监控Rab​​bitMQ服务器。

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

<强>策略: 添加与队列名称匹配的策略和max-lenght规则。可以通过进入管理界面然后按管理选项卡添加策略。 (不要忘记在应用后删除该政策。)

答案 2 :(得分:1)

另一个选择是将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"));
                });

答案 3 :(得分:0)

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

答案 4 :(得分:0)

更具体地说,来自/api/queues/vhost/name/contents上的HTTP API:Http动词DELETE

引用:“队列的内容。要清除DELETE。注意你不能得到它。”

答案 5 :(得分:0)

根据Andy Skirrow的建议(在评论中),我已经设定了过期&#39;在将每个消息发布到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 :(得分:0)

如果您要清除非零值队列,请使用以下命令:

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

当然,您可以针对所有队列进行自定义设置。