Hapus semua antrian dari RabbitMQ?


188

Saya menginstal rabbitmqadmindan dapat mendaftar semua pertukaran dan antrian. Bagaimana saya bisa menggunakan rabbitmqadminatau rabbitmqctlmenghapus semua antrian.

Jawaban:


271

Pertama, daftarkan antrian Anda:

rabbitmqadmin list queues name

Kemudian dari daftar, Anda harus menghapusnya secara manual satu per satu:

rabbitmqadmin delete queue name='queuename'

Karena format output, tidak muncul Anda dapat menerima tanggapan dari list queues. Atau, jika Anda hanya mencari cara untuk menghapus semuanya (baca: setel ulang semua pengaturan , kembalikan instalasi ke keadaan default), gunakan:

rabbitmqctl stop_app
rabbitmqctl reset    # Be sure you really want to do this!
rabbitmqctl start_app

4
untuk melihat semua tugas yang tertunda di rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
Ketahuilah bahwa "reset rabbitmqctl" akan mengatur ulang semuanya kembali ke "pengaturan pabrik". Setiap pengguna RabbitMQ, host virtual, dll, yang telah Anda buat akan terpesona.
thoufek

Permintaan maaf @ smartnut007, saya telah mengklarifikasi bagian kedua dari jawaban dengan penafian.
lukiffer

24
hanya meraih antrian yang kosong. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan Itu akan menghapus semua antrian dengan 0 pada nama atau jumlah. Mungkin ingin melakukan grep $'\t0'atau sesuatu.
Woot

51

Dengan rabbitmqadminAnda dapat menghapusnya dengan liner satu ini:

rabbitmqadmin -f tsv -q list queues name | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done

Dalam kasus saya, antrean diawali dengan kata kunci yang dapat saya gunakan egrep, jadi perintah saya akan terlihat seperti ini:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Log

48

Sebenarnya sangat mudah dengan plugin dan kebijakan manajemen :

  • Konsol Manajemen Goto (localhost: 15672)

  • Tab Admin Goto

  • Tab Kebijakan Goto (di sebelah kanan)

  • Tambahkan Kebijakan

  • Isi Fields

    • Virtual Host: Pilih
    • Nama: Kedaluwarsa Semua Kebijakan (Hapus Nanti)
    • Pola:. *
    • Berlaku untuk: Antrian
    • Definisi: kedaluwarsa dengan nilai 1 (ubah jenis dari String ke Nomor)
  • Menyimpan

  • Tab Antrian Checkout lagi
  • Semua Antrian harus dihapus
  • Dan jangan lupa hapus kebijakan !!!!!! .

1
pilih "Angka" pada Definisi. Tidak berfungsi dengan default ("String")
Mathias

Jawaban yang bagus, benar-benar membentuk hariku. Jika Anda memilih "Pertukaran dan Antrian" dari daftar, Anda dapat dengan mudah menghapus Antrian dan Pertukaran. Saya berharap ini bisa menjadi jawaban yang diterima.
Wiktor Zychla

Solusi yang sangat bersih, tanpa perlu bermain-main misalnya SSH.
acidburn23

Sayang sekali tidak ada yang menjelaskan cara menginstal plugin dan kebijakan manajemen
gelonida

@MESUTA. Terima kasih banyak. Saya pikir ada baiknya memiliki tautan ini di artikel ini. Mungkin lebih baik menambahkannya ke jawaban, karena komentar mungkin dibersihkan. Tapi saya sekarang setidaknya memiliki info ini
gelonida

19

Coba ini:

 rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn

2
Ini bekerja untuk saya, tetapi juga menunjukkan *** Not found: /api/queues/%2F/namekarena outputnya adalah tabel ASCII dengan kolom "nama". Saya mengubah perintah rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qnuntuk memperbaikinya.
Mark Edington

rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
Scott Leonard

9

Jika Anda belum menginstal rabbitmqadmin, coba bersihkan antrian dengan rabbitmqctl:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue


Tidak ada delete_queueatau purge_queueperintah di rabbitmqctl. Saya ingin membersihkan banyak antrian yang tampaknya dibuat secara otomatis dan saya tidak ingin menginstal perangkat lunak tambahan seperti rabbitmqadmin...
Rolice

rabbitmqctl purge_queuebekerja di sini secara manual. Saya hanya perlu menambahkan -p <virtual-host>
Roman Susi

Bertentangan dengan apa yang @Rolice dinyatakan di atas, baik delete_queuedan purge_queuetersedia dalam rabbitmqctldan saya baru saja menjalankan mereka berhasil. Mungkin Anda menggunakan versi lama.
Richard Dunn

Senang mendengarnya, ini bisa saja ditambahkan baru-baru ini.
Rolice

7

Jika Anda mencoba untuk menghapus antrian karena tidak digunakan dan Anda tidak ingin mengatur ulang, salah satu opsi adalah mengatur antrian TTL sangat rendah melalui kebijakan, tunggu antrian dihapus secara otomatis setelah TTL disahkan dan kemudian hapus kebijakan ( https://www.rabbitmq.com/ttl.html ).

rabbitmqctl.bat set_policy delq ".*" '{"expires": 1}' --apply-to queues

Untuk menghapus kebijakan

rabbitmqctl clear_policy delq

Perhatikan bahwa ini hanya berfungsi untuk antrian yang tidak digunakan

Info asli di sini: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html


6

Saya membuat deleteRabbitMqQs.sh, yang menerima argumen untuk mencari daftar antrian, memilih hanya yang cocok dengan pola yang Anda inginkan. Jika Anda tidak menawarkan argumen, itu akan menghapus semuanya! Ini menunjukkan kepada Anda daftar antrian yang akan dihapus, membiarkan Anda berhenti sebelum melakukan sesuatu yang merusak.

for word in "$@"
do
        args=true
        newQueues=$(rabbitmqctl list_queues name | grep "$word")
        queues="$queues
$newQueues"
done
if [ $# -eq 0 ]; then
        queues=$(rabbitmqctl list_queues name | grep -v "\.\.\.")
fi

queues=$(echo "$queues" | sed '/^[[:space:]]*$/d')

if [ "x$queues" == "x" ]; then
        echo "No queues to delete, giving up."
        exit 0
fi

read -p "Deleting the following queues:
${queues}
[CTRL+C quit | ENTER proceed]
"

while read -r line; do
        rabbitmqadmin delete queue name="$line"
done <<< "$queues"

Jika Anda ingin pencocokan yang berbeda dengan argumen yang Anda berikan, Anda dapat mengubah grep di baris empat. Ketika menghapus semua antrian, itu tidak akan menghapus yang dengan tiga spasi berturut-turut di dalamnya, karena saya pikir kemungkinan akan lebih jarang daripada orang-orang yang rabbitmqctl mencetak hasilnya dalam bahasa yang berbeda.

Nikmati!


6

Di Rabbit versi 3.7.10 Anda dapat menjalankan perintah di bawah ini dengan izin root:

rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue

5

Ini cara untuk melakukannya dengan PowerShell. URL mungkin perlu diperbarui

$cred = Get-Credential
 iwr -ContentType 'application/json' -Method Get -Credential $cred   'http://localhost:15672/api/queues' | % { 
    ConvertFrom-Json  $_.Content } | % { $_ } | ? { $_.messages -gt 0} | % {
    iwr  -method DELETE -Credential $cred  -uri  $("http://localhost:15672/api/queues/{0}/{1}" -f  [System.Web.HttpUtility]::UrlEncode($_.vhost),  $_.name)
 }

Catatan, ini hanya menghapus antrian yang tidak kosong. Hapus klausa -gt untuk menghapus semua antrian
Peter Goodman

4

Anda dapat menggunakan eval rabbitmqctl seperti di bawah ini:

rabbitmqctl eval 'IfUnused = false, IfEmpty = true, MatchRegex = 
<<"^prefix-">>, [rabbit_amqqueue:delete(Q, IfUnused, IfEmpty) || Q <- 
rabbit_amqqueue:list(), re:run(element(4, element(2, Q)), MatchRegex) 
=/= nomatch ].' 

Di atas akan menghapus semua antrian kosong di semua vhosts yang memiliki nama yang diawali dengan "awalan-". Anda dapat mengedit variabel IfUnused, IfEmpty, dan MatchRegex sesuai kebutuhan Anda.


Sempurna untuk saat rabbitmqadmintidak dapat diakses.
NuSkooler

Saya menemukan ini jauh lebih cepat daripada list_queues
TerrenceSun

3

Menghapus semua antrian menggunakan rabbitmqctl one liner

rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue

2

Jika Anda hanya ingin membersihkan antrian yang tidak kosong (jauh lebih cepat):

rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue

Bagi saya, dibutuhkan 2-3 detik untuk membersihkan antrian (baik yang kosong maupun yang tidak kosong), jadi iterasi melalui 50 antrian adalah hal yang menyakitkan, sementara saya hanya perlu membersihkan 10 dari antrian (40/50 kosong).


2

Saya mencoba rabbitmqctl dan mengatur ulang perintah tetapi sangat lambat.

Ini adalah cara tercepat yang saya temukan (ganti nama pengguna dan kata sandi Anda):

#!/bin/bash

# Stop on error
set -eo pipefail

USER='guest'
PASSWORD='guest'

curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/queues/%2f/@
# To also delete exchanges uncomment next line
# curl -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/ | jq '.[].name' | sed 's/"//g' | xargs -L 1 -I@ curl -XDELETE -sSL -u $USER:$PASSWORD http://localhost:15672/api/exchanges/%2f/@

Catatan: Ini hanya berfungsi dengan vhost default /


2

Untuk membuat daftar antrian,

./rabbitmqadmin -f tsv -q list queues

Untuk menghapus antrian,

./rabbitmqadmin delete queue name=name_of_queue

1

Ini adalah versi yang lebih cepat (menggunakan parallelinstall sudo apt-get install parallel) memperluas jawaban yang sangat baik oleh @admenva

parallel -j 50 rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -q delete queue name={} ::: $(rabbitmqadmin -H YOUR_HOST_OR_LOCALHOST -f tsv -q list queues name)


1

Perintah ini menghapus semua antrian Anda

python rabbitmqadmin.py \
  -H YOURHOST -u guest -p guest -f bash list queues | \
xargs -n1 | \
xargs -I{} \
  python rabbitmqadmin.py -H YOURHOST -u guest -p guest delete queue name={}

Skrip ini sangat sederhana karena digunakan -f bash, yang menampilkan antrian sebagai daftar.

Kemudian kita gunakan xargs -n1untuk membaginya menjadi beberapa variabel

Kemudian kita gunakan xargs -I{}yang akan menjalankan perintah berikut, dan ganti {}di perintah.


Saya sudah mencoba 10 jawaban berbeda, dan ini HANYA hal yang benar-benar bekerja untuk menghapus antrian tanpa membunuh semua pengaturan saya yang lain. Terima kasih! Saya tidak percaya rabbitmqctl tidak hanya memiliki perintah "drop all antrian".
sudo

BTW, untuk mendapatkan rabbitmqadmin, Anda harus pergi http://yourhost:15672/cli/dan mengunduhnya.
sudo

1

Anda tidak perlu mereset server rabbitmq untuk menghapus antrian yang tidak tahan lama . Cukup hentikan server dan mulai lagi dan itu akan menghapus semua antrian tidak tahan lama yang tersedia.


termasuk antrian yang tahan lama? Saya kira tidak. Saya akan memenuhi syarat jawaban Anda.
Hendy Irawan

Tidak, antrian yang tahan lama tidak dapat dihapus dengan menghentikan server. Mereka dapat dihapus dari antarmuka web Manajemen RabbitMQ di bawah antrian.
ErAcube

Sebenarnya ya, ini membantu saya dan semua 4.500 antrian yang dihasilkan secara otomatis hilang. Tampaknya ini bukan yang tahan lama. Terima kasih!
Rolice

1

Untuk yang memiliki masalah dengan menginstal rabbitmqadmin, Anda harus menginstal python terlebih dahulu.

Pengguna sistem operasi mirip UNIX perlu menyalin rabbitmqadmin ke direktori di PATH, mis. / Usr / local / bin.

Pengguna Windows perlu memastikan Python ada di PATH mereka, dan memanggil rabbitmqadmin sebagai python.exe rabbitmqadmin.

Kemudian

  1. Telusuri http://{hostname}:15672/cli/rabbitmqadminuntuk mengunduh.
  2. Buka folder yang berisi lalu jalankan cmd dengan hak administrator

Untuk daftar Antrian python rabbitmqadmin list queues .

Untuk menghapus Antrian python rabbitmqadmin delete queue name=Name_of_queue

Untuk Menghapus semua Antrian

1- Menyatakan Kebijakan

python rabbitmqadmin declare policy name='expire_all_policies' pattern=.* definition={\"expires\":1} apply-to=queues

2- Hapus kebijakan

python rabbitmqadmin  delete policy name='expire_all_policies'

0

Ada cara untuk menghapus semua antrian dan pertukaran tanpa skrip dan set lengkap. Anda bisa menghapus dan membuat kembali host virtual dari antarmuka admin. Ini akan berfungsi bahkan untuk vhost /.

Satu-satunya hal yang perlu Anda pulihkan adalah izin untuk vhost yang baru dibuat.


0

Oke, kualifikasi penting untuk jawaban ini: Pertanyaannya tidak meminta untuk menggunakan rabbitmqctl ATAU rabbitmqadmin untuk menyelesaikan ini, jawaban saya perlu menggunakan keduanya. Juga, perhatikan bahwa ini diuji pada MacOS 10.12.6 dan versi rabbitmqctl dan rabbitmqadmin yang diinstal ketika menginstal rabbitmq dengan Homebrew dan yang diidentifikasi brew list --versionssebagai rabbitmq 3.7.0

rabbitmqctl list_queues -p <VIRTUAL_HOSTNAME> name | sed 1,2d | xargs -I qname rabbitmqadmin --vhost <VIRTUAL_HOSTNAME> delete queue name=qname


0

Pilihan lain adalah menghapus vhost yang terkait dengan antrian. Ini akan menghapus semua yang terkait dengan vhost, jadi berhati-hatilah, tetapi mudah dan cepat.


CATATAN: tim RabbitMQ memonitor para rabbitmq-usersmailing list dan hanya kadang-kadang menjawab pertanyaan pada StackOverflow.


0

Saya mencoba potongan-potongan kode di atas tetapi saya tidak melakukan streaming.

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

Saya menghasilkan file yang berisi semua nama antrian dan loop melalui baris demi baris untuk menghapusnya. Untuk loop, while read ...tidak melakukannya untukku. Itu selalu berhenti di nama antrian pertama.


-1
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname

1
Saya menerima ini ketika menjalankannya: kepala: penghitungan baris ilegal - -1
Robert Ross

"Head -n-1" harus berupa "head -1" atau "head -n 1"
Gerd Busker
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.