ฉันติดตั้งrabbitmqadmin
และสามารถแสดงรายการการแลกเปลี่ยนและคิวทั้งหมด ฉันจะใช้rabbitmqadmin
หรือrabbitmqctl
ลบคิวทั้งหมดได้อย่างไร
ฉันติดตั้งrabbitmqadmin
และสามารถแสดงรายการการแลกเปลี่ยนและคิวทั้งหมด ฉันจะใช้rabbitmqadmin
หรือrabbitmqctl
ลบคิวทั้งหมดได้อย่างไร
คำตอบ:
ขั้นแรกให้เขียนรายการคิวของคุณ:
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
rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
grep $'\t0'
อะไรซักอย่าง
ด้วย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
ง่ายสุด ๆ ด้วยปลั๊กอินการจัดการและนโยบาย:
Goto Management Console (localhost: 15672)
ไปที่แท็บผู้ดูแลระบบ
แท็บนโยบายไปที่(ด้านขวา)
เพิ่มนโยบาย
เติมฟิลด์
บันทึก
ลองสิ่งนี้:
rabbitmqadmin list queues name | awk '{print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
*** Not found: /api/queues/%2F/name
เพราะผลลัพธ์เป็นตาราง ASCII ที่มีคอลัมน์ "ชื่อ" ฉัน tweaked คำสั่งrabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qn
เพื่อแก้ไข
rabbitmqadmin list queues name | awk {'print$2'} | egrep [^name] | xargs -I qname rabbitmqadmin delete queue name=qname
หากคุณไม่ได้ติดตั้ง rabbitmqadmin ลองกำจัดคิวด้วย rabbitmqctl:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl purge_queue
delete_queue
หรือสิ่งต่อไปนี้ ผมอยากจะล้างจำนวนมากของคิวที่ดูเหมือนจะถูกสร้างขึ้นโดยอัตโนมัติและฉันจะไม่เหมือนการติดตั้งซอฟต์แวร์พิเศษเช่น...purge_queue
rabbitmqctl
rabbitmqadmin
rabbitmqctl purge_queue
ทำงานที่นี่ด้วยตนเอง ฉันต้องการเพิ่ม -p <virtual-host> เท่านั้น
delete_queue
และpurge_queue
มีให้ในrabbitmqctl
และฉันเพิ่งจะเรียกใช้งานได้สำเร็จ บางทีคุณอาจใช้เวอร์ชั่นเก่า
หากคุณกำลังพยายามลบคิวเนื่องจากไม่ได้ใช้งานและคุณไม่ต้องการรีเซ็ตหนึ่งตัวเลือกคือตั้งค่าคิว 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
ฉันสร้าง 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 ที่พิมพ์ออกมาในภาษาต่างๆ
สนุก!
ใน Rabbit เวอร์ชั่น 3.7.10 คุณสามารถเรียกใช้คำสั่งด้านล่างโดยได้รับอนุญาตรูท:
rabbitmqctl list_queues | awk '{ print $1 }' | xargs -L1 rabbitmqctl delete_queue
นี่คือวิธีที่จะทำกับ 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)
}
คุณสามารถใช้ 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
ไม่สามารถเข้าถึงได้
การลบคิวทั้งหมดโดยใช้ rabbitmqctl หนึ่งไลเนอร์
rabbitmqctl list_queues | awk '{ print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
ในกรณีที่คุณต้องการกำจัดคิวที่ไม่ว่างเปล่า (เร็วกว่ามาก):
rabbitmqctl list_queues | awk '$2!=0 { print $1 }' | sed 's/Listing//' | xargs -L1 rabbitmqctl purge_queue
สำหรับฉันมันใช้เวลา 2-3 วินาทีในการล้างคิว (ทั้งที่ว่างและไม่ว่าง) ดังนั้นการวนซ้ำผ่าน 50 คิวจึงเป็นความเจ็บปวดในขณะที่ฉันเพิ่งล้าง 10 รายการ (ว่าง 40/50)
ฉันลอง 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 /
ในการแสดงรายการคิว
./rabbitmqadmin -f tsv -q list queues
ในการลบคิว
./rabbitmqadmin delete queue name=name_of_queue
นี่คือรุ่นที่เร็วขึ้น (โดยใช้การ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)
คำสั่งนี้จะลบคิวทั้งหมดของคุณ
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{}
ที่จะเรียกใช้คำสั่งดังต่อไปนี้และแทนที่{}
ในคำสั่ง
http://yourhost:15672/cli/
และดาวน์โหลด
คุณไม่จำเป็นต้องรีเซ็ตเซิร์ฟเวอร์ rabbitmq เพื่อลบคิวที่ไม่คงทน เพียงหยุดเซิร์ฟเวอร์และเริ่มต้นอีกครั้งและจะลบคิวที่ไม่คงทนทั้งหมดที่มีอยู่ออก
สำหรับผู้ที่มีปัญหาในการติดตั้ง rabbitmqadmin คุณควรติดตั้ง python ก่อน
ผู้ใช้ระบบปฏิบัติการที่เหมือน UNIX จำเป็นต้องคัดลอก rabbitmqadmin ไปยังไดเรกทอรีใน PATH เช่น / usr / local / bin
ผู้ใช้ Windows จะต้องตรวจสอบให้แน่ใจว่า Python อยู่ใน PATH และเรียกใช้ rabbitmqadmin ในฐานะ python.exe rabbitmqadmin
แล้วก็
http://{hostname}:15672/cli/rabbitmqadmin
เพื่อดาวน์โหลด
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'
มีวิธีลบคิวและการแลกเปลี่ยนทั้งหมดโดยไม่มีสคริปต์และการรีเซ็ตแบบเต็ม คุณสามารถลบและสร้างโฮสต์เสมือนใหม่ได้จากส่วนต่อประสานผู้ดูแลระบบ นี้จะทำงานแม้สำหรับ /
vhost
สิ่งเดียวที่คุณจะต้องกู้คืนคือสิทธิ์สำหรับ vhost ที่สร้างขึ้นใหม่
โอเคคุณสมบัติสำคัญสำหรับคำตอบนี้: คำถามขอให้ใช้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
ตัวเลือกอื่นคือการลบ vhost ที่เกี่ยวข้องกับคิว การทำเช่นนี้จะลบทุกอย่างที่เกี่ยวข้องกับ vhost ดังนั้นจึงควรได้รับการเตือน แต่ง่ายและรวดเร็ว
หมายเหตุ:ทีม RabbitMQ ตรวจสอบการรายชื่อผู้รับจดหมายและบางครั้งเท่านั้นที่จะตอบคำถามใน StackOverflowrabbitmq-users
ฉันลองใช้โค้ดด้านบน แต่ไม่ได้ทำการสตรีม
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
ฉันสร้างไฟล์ที่มีชื่อคิวทั้งหมดและวนซ้ำไปเรื่อย ๆ ทีละบรรทัดเพื่อลบออก สำหรับลูปwhile read ...
ไม่ได้ทำเพื่อฉัน มันหยุดเสมอที่ชื่อคิวแรก
rabbitmqadmin list queues|awk 'NR>3{print $4}'|head -n-1|xargs -I qname rabbitmqadmin delete queue name=qname
rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged