RabbitMQでのキューの削除


93

RabbitMQで実行しているキューがいくつかあります。それらのうちのいくつかは現在役に立たないのですが、どうすれば削除できますか?残念ながら、私はauto_deleteオプションを設定していませんでした。

今設定すると削除されますか?

これらのキューを今すぐ削除する方法はありますか?

回答:


121

管理データベースのデータを気にしない場合; すなわちusersvhostsmessagesなど、そしてどちらについて他queues、その後、あなたができるresetために、次のコマンドを実行して、コマンドライン経由:

警告:これにより、キューに加えて、RabbitMQサーバーで構成されているすべてのとが削除されます。そして永続的なものを削除しますusersvhostsmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

RabbitMQのドキュメントはと言うresetコマンドを実行します。

RabbitMQノードを未使用の状態に戻します。

所属するクラスターからノードを削除し、構成済みのユーザーや仮想ホストなどのすべてのデータを管理データベースから削除し、すべての永続メッセージを削除します。

そのため、使用には注意してください。


46
警告:これにより、ウサギサーバーで設定したユーザーと仮想ホストも削除されます。私はこれを難しい方法で見つけました:)
mafrosis

おっと、ごめんなさい。rabbitmqに携わっていた当時は本当に基本的な構成だったので気づきませんでした。回答を更新します。ありがとう!
Faruk Sahin 2013年

3
これは本当に極端な答えです。また、「サーバーをシャットダウンしてディスクを消去する」と言ってキューを「削除」することもできます。
RubyTuesdayDONO 2017

30
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をインストールするには、setuptoolsのMS Windowsインストーラーを実行します

> easy_install pip
> pip install pika==0.9.8

ピカをすでに使用している人にとっては間違いなく簡単です。ありがとう
ござい

27

RabbitMQバージョン> 3.0では、rabbitmq_managementプラグインが有効になっている場合、HTTP APIを利用することもできます。必ずcontent-typeを 'application / json'に設定し、仮想ホストとキュー名を指定してください:

仮想ホスト「test」とキュー名「testqueue」でcurlを使用するIE:

$ 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

1
ユーザーにタグが付けられていることを確認してください。administratorそうでない場合、ユーザーはAPIの特定の部分を使用できません。
ubershmekel 14

1
私は得$ 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 ています:ただし、キューはまだ残っています: (-何かアイデアはありますか?
Hackeron

23

コンソールからの作業に便利なrabbitmqadminがあります。

rabbitがインストールされているサーバーにssh /ログインする場合は、次の場所からダウンロードできます。

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からのコメントの時点で、ウサギのユーザーが「管理者」としてタグ付けされている必要があることを指摘すると役立つ場合があります。(https://www.rabbitmq.com/management.html


これは、「接続できませんでした:[Errno 111]接続が拒否されました」を表示して、何が起こっているのかをデバッグする方法を教えてください。
user299709

認証ログ、ウサギログを確認してください...ユーザーがVHostで作業する権限を持っていない可能性があります...どこから始めればいいのかわかりません
Lukino

解決策は 'administrator'タグでユーザーを設定することでした
user299709

16

RMQサーバーを実行しているホストからのすべてのデフォルト値を使用したキューのクイック削除の簡単な要約:

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

特定のvhostのパターンに一致するすべてのキューを削除するには(たとえば、ルートvhostに 'amq.gen'を含む):

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

15

queue.declareを使用して、キューが存在する(存在しない場合は作成する)ことを表明します。最初に自動削除をfalseに設定した場合、autodelete trueを指定してqueue.declareを再度呼び出すと、ソフトエラーが発生し、ブローカーがチャネルを閉じます。

削除するには、今すぐqueue.deleteを使用する必要があります。

詳細については、APIドキュメントを参照してください。

別のクライアントを使用している場合は、同等のメソッドを見つける必要があります。それはプロトコルの一部なので、そこにあるべきであり、おそらくChannelまたは同等のものの一部です。

また、残りのドキュメント、特に多くの一般的な使用例をカバーする「はじめに」セクションを確認することもできます。

最後に、質問があって他に答えが見つからない場合は、RabbitMQディスカッションメーリングリストに投稿してみてください。開発者は、そこで尋ねられるすべての質問に答えるために最善を尽くします。


10

別のオプションは、management_pluginを有効にして、ブラウザ経由でそれに接続することです。すべてのキューとそれらに関する情報を表示できます。このインターフェースからキューを削除することは可能で簡単です。


私はこれを実行しましたが、management_pluginはコマンドラインインターフェースとは異なる状態です
Sweet Chilly Philly

9

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');

自己責任でご利用ください!


1
これは、Web管理者のみを使用して、同じプレフィックスを持つ多数のキューを削除するのに完全に機能しました。ありがとう!
espenoh、2016

6

管理プラグイン(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

5

私はこのエイリアスをで使用しています.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の反復バージョンのコードです。



5

うまくいけば、それは誰かを助けるかもしれません。

上記のコードを試しましたが、ストリーミングは行いませんでした。

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

すべてのキュー名を含むファイルを生成し、1行ずつループして削除します。ループについては、while read ...、私のためにそれをしませんでした。常に最初のキュー名で停止していました。

また、1つのキューを削除する場合は、上記の解決策(Python、Java ...)も役立ちますdo sudo rabbitmqctl delete_queue queue_name。のrabbitmqctl代わりに使用していますrabbitmqadmin


4

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、またはslowの語なしですべてのキューを削除するとします。

tr "[:blank:]" " " キューの名前とそこにあるタスクの量の間でrabbitmqctlの区切り文字を正規化します

cut -d " " -f 1分割空白で各行を1列(キュー名)を選びます

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}キュー名を{}取得し、プロセスでフィルタリングされていないすべてのキューを削除する文字を設定する場所に設定します。

使用するユーザーに管理者権限があることを確認してください。


インスピレーションのための@phriscageのおかげで:)
Hassek

2

管理Webページにしかアクセスできなかったので、私は別の方法で行いました。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の形式でした

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.