【问题标题】:Deleting queues in RabbitMQ在 RabbitMQ 中删除队列
【发布时间】:2011-10-08 05:56:32
【问题描述】:

我有几个使用 RabbitMQ 运行的队列。现在有几个没用了,怎么删除呢?不幸的是,我没有设置auto_delete 选项。

如果我现在设置,会被删除吗?

现在有办法删除这些队列吗?

【问题讨论】:

    标签: queue rabbitmq


    【解决方案1】:

    如果您不关心管理数据库中的数据;即usersvhostsmessages等,而不是其他queues,那么您可以通过命令行按顺序运行以下命令来reset

    警告:除了队列之外,这还将删除任何 usersvhosts >,你已经在你的 RabbitMQ 服务器上进行了配置;并将删除任何持久的messages

    rabbitmqctl stop_app
    rabbitmqctl reset
    rabbitmqctl start_app
    

    rabbitmq documentation 表示reset 命令:

    将 RabbitMQ 节点返回到其原始状态。

    从它所属的任何集群中删除节点,从其中删除所有数据 管理数据库,例如配置的用户和虚拟主机,以及 删除所有持久消息。

    所以,小心使用它。

    【讨论】:

    • 警告:这也会删除您在 rabbit 服务器上配置的所有用户和虚拟主机。我很难找到这个:)
    • 糟糕,很抱歉。我没有注意到它,因为我在参与rabbitmq 时有一个非常基本的配置。我会更新答案。谢谢!
    • 这是一个非常极端的答案。你也可以说“关闭服务器并擦除磁盘”来“删除”队列。
    【解决方案2】:
    import pika
    
    connection = pika.BlockingConnection(pika.ConnectionParameters(
                   'localhost'))
    channel = connection.channel()
    
    channel.queue_delete(queue='queue-name')
    
    connection.close()
    

    如下安装pika包

    $ sudo pip install pika==0.9.8
    

    安装依赖于 pip 和 git-core 包,你可能需要先安装它们。

    在 Ubuntu 上:

    $ sudo apt-get install python-pip git-core
    

    在 Debian 上:

    $ sudo apt-get install python-setuptools git-core
    $ sudo easy_install pip
    

    在 Windows 上:要安装 easy_install,请运行 MS Windows Installer for setuptools

    > easy_install pip
    > pip install pika==0.9.8
    

    【讨论】:

    • 对于已经使用 pika 的人来说绝对更容易,非常感谢
    【解决方案3】:

    在 RabbitMQ 版本 > 3.0 中,如果启用了 rabbitmq_management 插件,您还可以使用 HTTP API。只需确保将内容类型设置为“应用程序/json”并提供虚拟主机和队列名称:

    I.E.将 curl 与 vhost 'test' 和队列名称 'testqueue' 一起使用:

    $ curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/test/testqueue
    HTTP/1.1 204 No Content
    Server: MochiWeb/1.1 WebMachine/1.9.0 (someone had painted it blue)
    Date: Tue, 16 Apr 2013 10:37:48 GMT
    Content-Type: application/json
    Content-Length: 0
    

    【讨论】:

    • 确保您的用户被标记为administrator,否则他们无法使用 API 的某些部分。
    • 我得到:$ curl -i -u 'user:pass' -H "content-type:application/json" -XDELETE 'http://localhost:15672/api/queues/vhostname/name.portal' HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact) Date: Wed, 30 Jul 2014 11:23:47 GMT Content-Type: application/json Content-Length: 0 但是队列仍然存在 :( - 有什么想法吗?
    【解决方案4】:

    rabbitmqadmin 非常适合从控制台工作。

    如果你 ssh/log 到你安装了 rabbit 的服务器,你可以从以下位置下载它:

    http://{server}:15672/cli/rabbitmqadmin
    

    并将其保存到 /usr/local/bin/rabbitmqadmin

    然后就可以运行了

    rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
    

    通常它需要 sudo。

    如果不想输入用户名和密码,可以使用config

    rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
    

    所有这些都假设您有文件 ** /var/lib/rabbitmq/.rabbitmqadmin.conf** 并且有最低限度

    hostname = localhost
    port = 15672
    username = {user}
    password = {password}
    

    编辑:根据@user299709 的评论,指出用户必须在rabbit 中标记为“管理员”可能会有所帮助。 (https://www.rabbitmq.com/management.html)

    【讨论】:

    • 这会返回 ` 无法连接:[Errno 111] Connection refused` 对我来说有什么方法可以调试以查看发生了什么?
    • 检查身份验证日志,兔子日志...用户可能没有权限在 VHost 上工作...退出很难说从哪里开始
    • 解决方案是使用“管理员”标签设置用户
    【解决方案5】:

    使用运行 RMQ 服务器的主机的所有默认值快速删除队列的简短摘要:

    curl -O http://localhost:15672/cli/rabbitmqadmin
    chmod u+x rabbitmqadmin
    ./rabbitmqadmin delete queue name=myQueueName
    

    删除与给定虚拟主机中的模式匹配的所有队列(例如,在根虚拟主机中包含“amq.gen”):

    rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
    

    【讨论】:

      【解决方案6】:

      您使用 queue.declare 断言队列存在(如果不存在则创建它)。如果您最初将 auto-delete 设置为 false,则在 autodelete true 的情况下再次调用 queue.declare 将导致软错误,并且 broker 将关闭通道。

      您现在需要使用 queue.delete 来删除它。

      详情请参阅 API 文档:

      如果您使用其他客户端,则需要找到等效的方法。因为它是协议的一部分,所以它应该在那里,而且它可能是 Channel 或等效的一部分。

      您可能还想查看文档的其余部分,尤其是涵盖许多常见用例的 Geting Started 部分。

      最后,如果您有问题并且在其他地方找不到答案,您应该尝试在RabbitMQ Discuss 邮件列表上发帖。开发人员尽最大努力回答那里提出的所有问题。

      【讨论】:

        【解决方案7】:

        另一个选项是启用 management_plugin 并通过浏览器连接到它。您可以查看所有队列和有关它们的信息。从这个界面删除队列是可能的并且很简单。

        【讨论】:

        • 我已经这样做了,但是我的 management_plugin 与我的命令行界面处于不同的状态
        【解决方案8】:

        我进一步概括了 Piotr Stapp 的 JavaScript/jQuery 方法,将它封装成一个函数并概括了一点。

        此函数使用 RabbitMQ HTTP API 查询给定vhost 中的可用队列,然后根据可选的queuePrefix 删除它们:

        function deleteQueues(vhost, queuePrefix) {
            if (vhost === '/') vhost = '%2F';  // html encode forward slashes
            $.ajax({
                url: '/api/queues/'+vhost, 
                success: function(result) {
                    $.each(result, function(i, queue) {
                        if (queuePrefix && !queue.name.startsWith(queuePrefix)) return true;
                        $.ajax({
                            url: '/api/queues/'+vhost+'/'+queue.name, 
                            type: 'DELETE', 
                            success: function(result) { console.log('deleted '+ queue.name)}
                        });
                    });
                }
            });
        };
        

        在您的 RabbitMQ 管理页面上,将此函数粘贴到浏览器的 JavaScript 控制台后,您可以像这样使用它:

        删除“/”虚拟主机中的所有队列

        deleteQueues('/');
        

        删除“/”虚拟主机中以“test”开头的所有队列

        deleteQueues('/', 'test');
        

        删除“dev”虚拟主机中以“foo”开头的所有队列

        deleteQueues('dev', 'foo');
        

        请自行承担风险!

        【讨论】:

        • 这非常适合仅使用网络管理员删除大量具有相同前缀的队列。谢谢!
        【解决方案9】:

        安装

        $ sudo rabbitmq-plugins enable rabbitmq_management
        

        如果您使用的是 localhost,请转到 http://localhost:15672/#/queues。默认密码为username: guestpassword: guest 并转到队列选项卡并删除队列。

        【讨论】:

        • 伙计...非常感谢。我发现你的回答很有帮助。
        【解决方案10】:

        管理插件(Web 界面)为您提供 Python 脚本的链接。您可以使用它来删除队列。我用这个模式移除了很多队列:

        python tmp/rabbitmqadmin --vhost=... --username=... --password=... list queues > tmp/q
        
        vi tmp/q # remove all queues which you want to keep
        
        cut -d' ' -f4 tmp/q| while read q; 
            do python tmp/rabbitmqadmin --vhost=... --username=... --password=... delete queue name=$q; 
        done
        

        【讨论】:

          【解决方案11】:

          我在.profile中使用这个别名:

          alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
          

          qclean.py 的代码如下:

          import sys
          import pika
          connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
          channel = connection.channel()
          
          queues = sys.stdin.readlines()[1:-1]
          for x in queues:
              q = x.split()[0]
              print 'Deleting %s...' %(q)
              channel.queue_delete(queue=q)
          
          connection.close()
          

          本质上,这是 Shweta B. Patil 代码的迭代版本。

          【讨论】:

            【解决方案12】:

            安装 rabbitmq_management 插件后,您可以运行它来删除所有不需要的队列:

            rabbitmqctl list_queues -p vhost_name |\
            grep -v "fast\|medium\|slow" |\
            tr "[:blank:]" " " |\
            cut -d " " -f 1 |\
            xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost_name>/{}
            

            让我们分解命令:

            rabbitmqctl list_queues -p vhost_name 将列出所有队列以及它们当前有多少任务。

            grep -v "fast\|medium\|slow" 将过滤您不想删除的队列,假设我们要删除不带 fastmedium 字样的每个队列慢

            tr "[:blank:]" " " 将规范化 rabbitmqctl 上队列名称和任务数量之间的分隔符

            cut -d " " -f 1分割每一行由空格并选择第一列(队列名称)

            xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/&lt;vhost&gt;/{} 将获取队列名称并将其设置到我们设置{} 字符的位置,删除所有未过滤的队列。

            确保使用的用户具有管理员权限。

            【讨论】:

            • 感谢@phriscage 的启发 :)
            【解决方案13】:

            希望它可以帮助某人。

            我尝试了上述代码,但没有进行任何流式传输。

            sudo rabbitmqctl list_queues | awk '{print $1}' &gt; queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done.

            我生成一个包含所有队列名称的文件,并逐行循环以删除它们。对于循环,while read ... 并没有为我做这件事。它总是停在第一个队列名称处。

            此外,如果您想删除单个队列,上述解决方案将有所帮助(python,Java ...)以及do sudo rabbitmqctl delete_queue queue_name。我使用的是rabbitmqctl 而不是rabbitmqadmin

            【讨论】:

              【解决方案14】:

              我的做法不同,因为我只能访问管理网页。我创建了简单的“sn-p”,它在 Javascript 中删除队列。这里是:

              function zeroPad(num, places) {
                var zero = places - num.toString().length + 1;
                return Array(+(zero > 0 && zero)).join("0") + num;
              }
              var queuePrefix = "PREFIX"
              for(var i=0; i<255; i++){ 
                 var queueid = zeroPad(i, 4);
                 $.ajax({url: '/api/queues/vhost/'+queuePrefix+queueid, type: 'DELETE', success: function(result) {console.log('deleted '+queuePrefix+queueid)}});
              }
              

              我所有队列的格式都是:PREFIX_0001 到 PREFIX_0XXX

              【讨论】:

                【解决方案15】:

                我一直在努力寻找适合我在 rabbigmq 中手动删除队列的需要的答案。因此,我认为在这个线程中值得一提的是,可以使用以下命令在没有rabbitmqadmin 的情况下删除单个队列:

                rabbitmqctl delete_queue <queue_name>
                

                【讨论】:

                  【解决方案16】:

                  如果你使用 C#,你可以像这样使用 HareDu API:

                  var result = await _services.GetService<IBrokerObjectFactory>()
                      .DeleteQueue("queue", "vhost");
                  

                  ...或

                  var result = await _services.GetService<IBrokerObjectFactory>()
                      .DeleteQueue("queue", "vhost", x =>
                      {
                          x.WhenHasNoConsumers();
                          x.WhenEmpty();
                      });
                  

                  https://github.com/ahives/HareDu2/blob/master/docs/queue-delete.md

                  【讨论】:

                  • 您似乎包含了指向您自己的产品或服务的链接,或者指向您所属的产品或服务的链接。如果是这种情况,you must disclose your affiliation in the answer itself..
                  • HareDu 是一个 100% 免费的 OSS 项目,如果使用像 C# 这样的 .NET 语言,它可以解决问题。
                  猜你喜欢
                  • 2013-11-23
                  • 2012-07-12
                  • 2015-12-20
                  • 2022-01-20
                  • 2011-05-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多