ลบคิวทั้งหมดจาก RabbitMQ หรือไม่


188

ฉันติดตั้งrabbitmqadminและสามารถแสดงรายการการแลกเปลี่ยนและคิวทั้งหมด ฉันจะใช้rabbitmqadminหรือrabbitmqctlลบคิวทั้งหมดได้อย่างไร

คำตอบ:


271

ขั้นแรกให้เขียนรายการคิวของคุณ:

rabbitmqadmin list queues name

จากรายการคุณจะต้องลบทีละรายการ:

rabbitmqadmin delete queue name='queuename'

เพราะรูปแบบการออกไม่ปรากฏคุณสามารถ grep list queuesการตอบสนองจาก หรือหากคุณเพียงแค่มองหาวิธีล้างทุกอย่าง (อ่าน: รีเซ็ตการตั้งค่าทั้งหมดกลับสู่การติดตั้งกลับสู่สถานะเริ่มต้น) ให้ใช้:

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

4
เพื่อดูงานที่รอดำเนินการทั้งหมดใน rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
โปรดทราบว่า "การตั้งค่ากระต่าย" จะรีเซ็ตทุกอย่างกลับเป็น "การตั้งค่าจากโรงงาน" ผู้ใช้ RabbitMQ โฮสต์เสมือน ฯลฯ ที่คุณสร้างขึ้นจะถูกลบออกไป
thoufek

ขอโทษ @ smartnut007 ฉันได้ชี้แจงส่วนที่สองของคำตอบด้วยข้อจำกัดความรับผิดชอบ
lukiffer

24
เพิ่งคว้าคิวที่ว่างเปล่า rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan นั่นจะลบคิวทั้งหมดด้วย 0 ในชื่อหรือจำนวน อาจต้องการทำgrep $'\t0'อะไรซักอย่าง
woot

51

ด้วยrabbitmqadminคุณสามารถลบออกด้วยหนึ่งซับ:

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

ในกรณีที่คิวของฉันจะนำหน้าด้วยคำหลักที่ฉันสามารถใช้เพียงegrepเพื่อให้คำสั่งของฉันจะมีลักษณะเช่นนี้:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Logans

48

ง่ายสุด ๆ ด้วยปลั๊กอินการจัดการและนโยบาย:

  • Goto Management Console (localhost: 15672)

  • ไปที่แท็บผู้ดูแลระบบ

  • แท็บนโยบายไปที่(ด้านขวา)

  • เพิ่มนโยบาย

  • เติมฟิลด์

    • โฮสต์เสมือน:เลือก
    • ชื่อ:หมดอายุนโยบายทั้งหมด (ลบภายหลัง)
    • รูปแบบ: . *
    • นำไปใช้กับ:คิว
    • คำจำกัดความ: หมดอายุด้วยค่า1 (เปลี่ยนประเภทจาก String เป็น Number)
  • บันทึก

  • แท็บCheckout Queuesอีกครั้ง
  • ต้องลบคิวทั้งหมด
  • และอย่าลืมลบนโยบาย !!!!!! .

1
เลือก "Number" ที่ Definition ไม่ทำงานกับค่าเริ่มต้น ("String")
Mathias

คำตอบที่ยอดเยี่ยมทำให้วันของฉันเป็นจริง หากคุณเลือก "การแลกเปลี่ยนและคิว" จากรายการคุณสามารถลบทั้งคิวและการแลกเปลี่ยนได้อย่างง่ายดาย ฉันหวังว่านี่อาจเป็นคำตอบที่ยอมรับได้
Wiktor Zychla

วิธีการแก้ปัญหาที่สะอาดมากโดยไม่จำเป็นต้องเล่นรอบอินสแตนซ์ SSH
acidburn23

Pity ไม่มีใครอธิบายวิธีการติดตั้งปลั๊กอินและนโยบายการจัดการ
gelonida

@MesutA ขอบคุณมาก. ฉันคิดว่ามันดีที่มีลิงค์นี้ในบทความนี้ อาจเป็นการดีกว่าถ้าเพิ่มไว้ในคำตอบเนื่องจากความคิดเห็นอาจถูกลบทิ้ง แต่ตอนนี้ฉันมีข้อมูลนี้อย่างน้อย
gelonida

19

ลองสิ่งนี้:

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

2
สิ่งนี้ใช้งานได้สำหรับฉัน แต่ก็แสดงให้เห็น*** Not found: /api/queues/%2F/nameเพราะผลลัพธ์เป็นตาราง ASCII ที่มีคอลัมน์ "ชื่อ" ฉัน tweaked คำสั่งrabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qnเพื่อแก้ไข
Mark Edington

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

9

หากคุณไม่ได้ติดตั้ง rabbitmqadmin ลองกำจัดคิวด้วย rabbitmqctl:

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


ไม่มีคำสั่งdelete_queueหรือสิ่งต่อไปนี้ ผมอยากจะล้างจำนวนมากของคิวที่ดูเหมือนจะถูกสร้างขึ้นโดยอัตโนมัติและฉันจะไม่เหมือนการติดตั้งซอฟต์แวร์พิเศษเช่น...purge_queuerabbitmqctlrabbitmqadmin
Rolice

rabbitmqctl purge_queueทำงานที่นี่ด้วยตนเอง ฉันต้องการเพิ่ม -p <virtual-host> เท่านั้น
Roman Susi

ขัดกับสิ่งที่ @Rolice ระบุไว้ข้างต้นทั้งสองdelete_queueและpurge_queueมีให้ในrabbitmqctlและฉันเพิ่งจะเรียกใช้งานได้สำเร็จ บางทีคุณอาจใช้เวอร์ชั่นเก่า
Richard Dunn

ดีใจที่ได้ยินว่าสิ่งเหล่านี้อาจถูกเพิ่มเข้ามาเมื่อเร็ว ๆ นี้
Rolice

7

หากคุณกำลังพยายามลบคิวเนื่องจากไม่ได้ใช้งานและคุณไม่ต้องการรีเซ็ตหนึ่งตัวเลือกคือตั้งค่าคิว TTL ต่ำมากผ่านนโยบายรอคิวจะถูกลบอัตโนมัติเมื่อผ่าน TTL จากนั้นลบนโยบายออก ( https://www.rabbitmq.com/ttl.html )

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

เพื่อลบนโยบาย

rabbitmqctl clear_policy delq

โปรดทราบว่าวิธีนี้ใช้ได้กับคิวที่ไม่ได้ใช้เท่านั้น

ข้อมูลดั้งเดิมที่นี่: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq.102333.html


6

ฉันสร้าง deleteRabbitMqQs.sh ซึ่งยอมรับอาร์กิวเมนต์เพื่อค้นหารายการของคิวเลือกเฉพาะรายการที่ตรงกับรูปแบบที่คุณต้องการ หากคุณไม่มีข้อโต้แย้งมันจะลบทิ้งทั้งหมด! มันจะแสดงรายการของคิวที่จะลบให้คุณออกก่อนที่จะทำการทำลาย

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"

หากคุณต้องการจับคู่ที่แตกต่างกับข้อโต้แย้งที่คุณผ่านคุณสามารถเปลี่ยน grep ในบรรทัดที่สี่ เมื่อลบคิวทั้งหมดมันจะไม่ลบคนที่มีช่องว่างติดต่อกันสามช่องเพราะฉันคิดว่าเหตุการณ์ที่ไม่คาดคิดจะหายากกว่าคนที่มี Rabbitmqctl ที่พิมพ์ออกมาในภาษาต่างๆ

สนุก!


6

ใน Rabbit เวอร์ชั่น 3.7.10 คุณสามารถเรียกใช้คำสั่งด้านล่างโดยได้รับอนุญาตรูท:

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

5

นี่คือวิธีที่จะทำกับ PowerShell อาจต้องอัปเดต URL

$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)
 }

หมายเหตุนี่เป็นการลบคิวที่ไม่ว่างเปล่าเท่านั้น ลบคำสั่ง -gt เพื่อลบคิวทั้งหมด
Peter Goodman

4

คุณสามารถใช้ rabbitmqctl eval ดังนี้:

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 ].' 

ด้านบนจะลบคิวที่ว่างเปล่าทั้งหมดใน vhosts ทั้งหมดที่มีชื่อขึ้นต้นด้วย "prefix-" คุณสามารถแก้ไขตัวแปร IfUnused, IfEmpty และ MatchRegex ตามความต้องการของคุณ


เหมาะสำหรับเมื่อrabbitmqadminไม่สามารถเข้าถึงได้
NuSkooler

ฉันพบสิ่งนี้เร็วกว่า list_queues
TerrenceSun

3

การลบคิวทั้งหมดโดยใช้ rabbitmqctl หนึ่งไลเนอร์

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

2

ในกรณีที่คุณต้องการกำจัดคิวที่ไม่ว่างเปล่า (เร็วกว่ามาก):

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

สำหรับฉันมันใช้เวลา 2-3 วินาทีในการล้างคิว (ทั้งที่ว่างและไม่ว่าง) ดังนั้นการวนซ้ำผ่าน 50 คิวจึงเป็นความเจ็บปวดในขณะที่ฉันเพิ่งล้าง 10 รายการ (ว่าง 40/50)


2

ฉันลอง rabbitmqctl และรีเซ็ตคำสั่ง แต่มันช้ามาก

นี่เป็นวิธีที่เร็วที่สุดที่ฉันพบ (เปลี่ยนชื่อผู้ใช้และรหัสผ่านของคุณ):

#!/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/@

หมายเหตุ: ใช้งานได้กับ vhost /



1

นี่คือรุ่นที่เร็วขึ้น (โดยใช้การparallelติดตั้ง sudo apt-get install ขนาน) การขยายคำตอบที่ยอดเยี่ยมโดย @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

คำสั่งนี้จะลบคิวทั้งหมดของคุณ

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={}

สคริปต์นี้ง่ายสุด ๆ เพราะมันใช้-f bashซึ่งเอาท์พุทของคิวเป็นรายการ

จากนั้นเราใช้xargs -n1ในการแยกมันออกเป็นหลาย ๆ ตัวแปร

จากนั้นเราใช้xargs -I{}ที่จะเรียกใช้คำสั่งดังต่อไปนี้และแทนที่{}ในคำสั่ง


ฉันได้ลองคำตอบต่าง ๆ 10 ข้อและนี่เป็นสิ่งเดียวที่ใช้งานได้จริงในการลบคิวโดยไม่ฆ่าการตั้งค่าอื่น ๆ ทั้งหมดของฉัน ขอบคุณ! ฉันไม่อยากจะเชื่อ Rabbitmqctl ไม่เพียงแค่มีคำสั่ง "ปล่อยคิวทั้งหมด"
sudo

BTW เพื่อรับ Rabbitmqadmin คุณต้องไปที่http://yourhost:15672/cli/และดาวน์โหลด
sudo

1

คุณไม่จำเป็นต้องรีเซ็ตเซิร์ฟเวอร์ rabbitmq เพื่อลบคิวที่ไม่คงทน เพียงหยุดเซิร์ฟเวอร์และเริ่มต้นอีกครั้งและจะลบคิวที่ไม่คงทนทั้งหมดที่มีอยู่ออก


รวมถึงคิวที่คงทน ฉันไม่คิดอย่างนั้น ฉันจะผ่านการคัดเลือกของคุณ
Hendy Irawan

ไม่ไม่สามารถลบคิวที่คงทนได้โดยหยุดเซิร์ฟเวอร์ สามารถลบได้จากส่วนต่อประสานเว็บการจัดการ RabbitMQ
ErAcube

ที่จริงแล้วใช่นี่ช่วยฉันและคิวที่สร้างขึ้นโดยอัตโนมัติประมาณ 4500 ตัวจะหายไป ดูเหมือนว่าสิ่งเหล่านี้ไม่คงทน ขอบคุณ!
Rolice

1

สำหรับผู้ที่มีปัญหาในการติดตั้ง rabbitmqadmin คุณควรติดตั้ง python ก่อน

ผู้ใช้ระบบปฏิบัติการที่เหมือน UNIX จำเป็นต้องคัดลอก rabbitmqadmin ไปยังไดเรกทอรีใน PATH เช่น / usr / local / bin

ผู้ใช้ Windows จะต้องตรวจสอบให้แน่ใจว่า Python อยู่ใน PATH และเรียกใช้ rabbitmqadmin ในฐานะ python.exe rabbitmqadmin

แล้วก็

  1. เรียกดูhttp://{hostname}:15672/cli/rabbitmqadminเพื่อดาวน์โหลด
  2. ไปที่โฟลเดอร์บรรจุแล้วเรียกใช้ cmd ด้วยสิทธิ์ผู้ดูแลระบบ

python rabbitmqadmin list queuesคิวรายการ

ในการลบคิว python rabbitmqadmin delete queue name=Name_of_queue

เพื่อลบคิวทั้งหมด

1- นโยบายการประกาศ

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

2- ลบนโยบาย

python rabbitmqadmin  delete policy name='expire_all_policies'

0

มีวิธีลบคิวและการแลกเปลี่ยนทั้งหมดโดยไม่มีสคริปต์และการรีเซ็ตแบบเต็ม คุณสามารถลบและสร้างโฮสต์เสมือนใหม่ได้จากส่วนต่อประสานผู้ดูแลระบบ นี้จะทำงานแม้สำหรับ /vhost

สิ่งเดียวที่คุณจะต้องกู้คืนคือสิทธิ์สำหรับ vhost ที่สร้างขึ้นใหม่


0

โอเคคุณสมบัติสำคัญสำหรับคำตอบนี้: คำถามขอให้ใช้rabbitmqctlหรือrabbitmqadminเพื่อแก้ปัญหานี้คำตอบของฉันจำเป็นต้องใช้ทั้งคู่ นอกจากนี้โปรดทราบว่าสิ่งนี้ได้รับการทดสอบบน MacOS 10.12.6 และเวอร์ชั่นของrabbitmqctlและrabbitmqadminที่ติดตั้งเมื่อติดตั้ง rabbitmq ด้วย Homebrew และระบุด้วยbrew list --versionsเป็น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

ตัวเลือกอื่นคือการลบ vhost ที่เกี่ยวข้องกับคิว การทำเช่นนี้จะลบทุกอย่างที่เกี่ยวข้องกับ vhost ดังนั้นจึงควรได้รับการเตือน แต่ง่ายและรวดเร็ว


หมายเหตุ:ทีม RabbitMQ ตรวจสอบการรายชื่อผู้รับจดหมายและบางครั้งเท่านั้นที่จะตอบคำถามใน StackOverflowrabbitmq-users


0

ฉันลองใช้โค้ดด้านบน แต่ไม่ได้ทำการสตรีม

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

ฉันสร้างไฟล์ที่มีชื่อคิวทั้งหมดและวนซ้ำไปเรื่อย ๆ ทีละบรรทัดเพื่อลบออก สำหรับลูปwhile read ...ไม่ได้ทำเพื่อฉัน มันหยุดเสมอที่ชื่อคิวแรก


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

1
ฉันได้รับสิ่งนี้เมื่อใช้งาน: หัว: นับจำนวนสายผิดกฎหมาย - -1
Robert Ross

"head -n-1" ควรเป็น "head -1" หรือ "head -n 1"
Gerd Busker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.