Xóa tất cả các hàng đợi từ RabbitMQ?


188

Tôi đã cài đặt rabbitmqadminvà có thể liệt kê tất cả các trao đổi và hàng đợi. Làm thế nào tôi có thể sử dụng rabbitmqadminhoặc rabbitmqctlxóa tất cả các hàng đợi.

Câu trả lời:


272

Đầu tiên, liệt kê hàng đợi của bạn:

rabbitmqadmin list queues name

Sau đó, từ danh sách, bạn sẽ cần xóa từng cái một cách thủ công:

rabbitmqadmin delete queue name='queuename'

Do định dạng đầu ra, không xuất hiện, bạn có thể grep phản hồi từ đó list queues. Ngoài ra, nếu bạn chỉ tìm cách xóa mọi thứ (đọc: đặt lại tất cả cài đặt , trả lại cài đặt về trạng thái mặc định), hãy sử dụng:

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

4
để xem tất cả các nhiệm vụ đang chờ xử lý trong rabbitmq:rabbitmqctl list_queues name messages messages_ready \ messages_unacknowledged
Guillaume Vincent

2
Xin lưu ý rằng "thiết lập lại rabbitmqctl" sẽ đặt lại mọi thứ về "cài đặt gốc". Bất kỳ người dùng RabbitMQ, máy chủ ảo, v.v., mà bạn đã tạo sẽ bị thổi bay.
thoufek

Xin lỗi @ smartnut007, tôi đã làm rõ phần thứ hai của câu trả lời từ chối trách nhiệm.
lukiffer

24
chỉ cần nắm lấy hàng đợi trống. rabbitmqctl list_queues | grep 0 | awk '{print $1}' | xargs -I qn rabbitmqadmin delete queue name=qn
au_stan

4
@au_stan Điều đó sẽ xóa tất cả các hàng đợi bằng 0 trong tên hoặc số đếm. Có thể muốn làm grep $'\t0'hoặc một cái gì đó.
woot

51

Với rabbitmqadminbạn có thể loại bỏ chúng bằng một lớp lót này:

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

Trong trường hợp của tôi, hàng đợi được bắt đầu bằng từ khóa mà tôi có thể sử dụng một cách đơn giản egrep, vì vậy lệnh của tôi sẽ giống như sau:rabbitmqadmin -f tsv -q list queues name | egrep "%search word%" | while read queue; do rabbitmqadmin -q delete queue name=${queue}; done
Đăng nhập

47

Thực sự siêu dễ dàng với các plugin và chính sách quản lý :

  • Bảng điều khiển quản lý Goto (localhost: 15672)

  • Tab quản trị Goto

  • Tab Chính sách Goto (ở bên phải)

  • Thêm chính sách

  • Điền vào các lĩnh vực

    • Máy chủ ảo: Chọn
    • Tên: Hết hạn tất cả các chính sách (Xóa sau)
    • Hoa văn : . *
    • Áp dụng cho: Hàng đợi
    • Định nghĩa: hết hạn với giá trị 1 (thay đổi loại từ Chuỗi thành Số)
  • Tiết kiệm

  • Thanh toán hàng đợi tab một lần nữa
  • Tất cả các hàng đợi phải được xóa
  • Và đừng quên xóa chính sách !!!!!! .

1
chọn "Số" tại Định nghĩa. Không hoạt động với mặc định ("Chuỗi")
Mathias

Câu trả lời tuyệt vời, thực sự tạo nên ngày của tôi. Nếu bạn chọn "Trao đổi và xếp hàng" từ danh sách, bạn có thể dễ dàng xóa cả Hàng đợi và Trao đổi. Tôi muốn điều này có thể là câu trả lời được chấp nhận.
Wiktor Zychla

Giải pháp rất sạch sẽ, không cần phải chơi xung quanh ví dụ SSH.
acidburn23 ngày

Đáng tiếc không ai giải thích cách cài đặt plugin và chính sách quản lý
gelonida

@MesutA. Cảm ơn rất nhiều. Tôi nghĩ thật tốt khi có liên kết này trong bài viết này. Nó có thể tốt hơn để thêm nó vào câu trả lời, vì ý kiến ​​có thể bị thanh trừng. Nhưng bây giờ tôi có ít nhất thông tin này
gelonida

19

Thử cái này:

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

2
Điều này làm việc cho tôi, nhưng cũng cho thấy *** Not found: /api/queues/%2F/namevì đầu ra là bảng ASCII với cột "tên". Tôi tinh chỉnh lệnh để được rabbitmqadmin list queues name | awk '!/--|name/ {print $2}' | xargs -I qn rabbitmqadmin delete queue name=qnsửa nó.
Đánh dấu Edington

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

9

Nếu bạn chưa cài đặt rabbitmqadmin, hãy thử thanh lọc hàng đợi với rabbitmqctl:

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


Không có lệnh delete_queuecũng không có . Tôi muốn thanh lọc rất nhiều hàng đợi dường như được tạo tự động và tôi không muốn cài đặt phần mềm bổ sung như ...purge_queuerabbitmqctlrabbitmqadmin
Rolice

rabbitmqctl purge_queuelàm việc ở đây bằng tay. Tôi chỉ cần thêm -p <máy chủ ảo>
Roman Susi

Trái với những gì @Rolice đã nêu ở trên, cả hai delete_queuepurge_queuecó sẵn trong rabbitmqctlvà Tôi vừa chạy chúng thành công. Có lẽ bạn đang ở một phiên bản cũ.
Richard Dunn

Thật tốt khi nghe điều đó, những thứ này có thể đã được thêm vào gần đây.
Rolice

6

Tôi đã thực hiện xóaRmusMqQs.sh, chấp nhận các đối số để tìm kiếm danh sách hàng đợi, chỉ chọn những đối số phù hợp với mẫu bạn muốn. Nếu bạn cung cấp không có đối số, nó sẽ xóa tất cả! Nó cho bạn thấy danh sách các hàng đợi sắp xóa, cho phép bạn thoát ra trước khi làm bất cứ điều gì phá hoại.

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"

Nếu bạn muốn kết hợp khác với các đối số bạn truyền vào, bạn có thể thay đổi grep trong dòng bốn. Khi xóa tất cả các hàng đợi, nó sẽ không xóa các hàng có ba khoảng trắng liên tiếp trong đó, vì tôi cho rằng sự kiện này sẽ hiếm hơn so với những người có rabbitmqctl in ra đầu ra bằng các ngôn ngữ khác nhau.

Thưởng thức!


6

Nếu bạn đang cố xóa hàng đợi vì chúng không được sử dụng và bạn không muốn đặt lại, một tùy chọn là đặt hàng đợi ở mức rất thấp thông qua chính sách, hãy đợi hàng đợi tự động bị xóa sau khi thông qua TTL và sau đó xóa chính sách ( https://www.rabbitmq.com/ttl.html ).

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

Để xóa chính sách

rabbitmqctl clear_policy delq

Lưu ý rằng điều này chỉ hoạt động cho hàng đợi không sử dụng

Thông tin gốc tại đây: http://rabbitmq.1065348.n5.nabble.com/Deleting-all-queues-in-rabbitmq-td30933.html


6

Trong phiên bản Rabbit 3.7.10, bạn có thể chạy lệnh bên dưới với quyền root:

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

5

Đây là một cách để làm điều đó với PowerShell. URL có thể cần được cập nhật

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

Lưu ý, điều này chỉ xóa hàng đợi không trống. Xóa mệnh đề -gt để xóa tất cả các hàng đợi
Peter Goodman

4

Bạn có thể sử dụng rabbitmqctl eval như dưới đây:

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

Ở trên sẽ xóa tất cả các hàng đợi trống trong tất cả các vhost có tên bắt đầu bằng "tiền tố-". Bạn có thể chỉnh sửa các biến IfUnuse, IfEmpty và MatchRegex theo yêu cầu của bạn.


Hoàn hảo cho khi rabbitmqadminkhông thể truy cập.
NuSkooler

Tôi thấy điều này nhanh hơn nhiều so với list_queues
TerrenceSun

3

Loại bỏ tất cả các hàng đợi bằng cách sử dụng một lớp lót rabbitmqctl

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

2

Trong trường hợp bạn chỉ muốn thanh lọc các hàng đợi không trống (nhanh hơn rất nhiều):

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

Đối với tôi, phải mất 2-3 giây để thanh lọc một hàng đợi (cả trống và không trống), vì vậy lặp đi lặp lại qua 50 hàng đợi là một nỗi đau trong khi tôi chỉ cần thanh lọc 10 trong số chúng (40/50 là trống).


2

Tôi đã thử các lệnh rabbitmqctl và thiết lập lại nhưng chúng rất chậm.

Đây là cách nhanh nhất tôi tìm thấy (thay thế tên người dùng và mật khẩu của bạn):

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

Lưu ý: Điều này chỉ hoạt động với vhost mặc định /


2

Để liệt kê hàng đợi,

./rabbitmqadmin -f tsv -q list queues

Để xóa một hàng đợi,

./rabbitmqadmin delete queue name=name_of_queue

1

Đây là phiên bản nhanh hơn (sử dụng parallelcài đặt sudo apt-get install song song) mở rộng dựa trên câu trả lời xuất sắc của @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

Lệnh này xóa tất cả các hàng đợi của bạn

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

Kịch bản này là siêu đơn giản bởi vì nó sử dụng -f bash, nó đưa ra các hàng đợi dưới dạng một danh sách.

Sau đó, chúng tôi sử dụng xargs -n1để chia nó thành nhiều biến

Sau đó, chúng tôi sử dụng xargs -I{}sẽ chạy lệnh sau và thay thế {}trong lệnh.


Tôi đã thử như 10 câu trả lời khác nhau và đây là điều CHỈ thực sự có tác dụng xóa hàng đợi mà không làm mất tất cả các cài đặt khác của tôi. Cảm ơn! Tôi không thể tin rằng rabbitmqctl không chỉ có lệnh "thả tất cả hàng đợi".
sudo

BTW, để có được rabbitmqadmin, bạn cần truy cập http://yourhost:15672/cli/và tải xuống.
sudo

1

Bạn không cần thiết lập lại máy chủ rabbitmq để xóa hàng đợi không bền . Chỉ cần dừng máy chủ và bắt đầu lại và nó sẽ xóa tất cả các hàng đợi không bền có sẵn.


bao gồm hàng đợi bền? Tôi không nghĩ vậy. Tôi sẽ đủ điều kiện trả lời của bạn.
Hendy IINA

Không, hàng đợi bền không thể bị xóa bằng cách dừng máy chủ. Chúng có thể bị xóa khỏi giao diện web của RabbitMQ Management trong hàng đợi.
ErAcube

Trên thực tế, điều này đã giúp tôi và tất cả khoảng 4500 hàng đợi được tạo tự động đã biến mất. Có vẻ như đây là những thứ không bền. Cảm ơn!
Rolice

1

Đối với những người có vấn đề với việc cài đặt rabbitmqadmin, trước tiên bạn nên cài đặt python.

Người dùng hệ điều hành giống như UNIX cần sao chép rabbitmqadmin vào một thư mục trong PATH, ví dụ / usr / local / bin.

Người dùng Windows sẽ cần đảm bảo Python nằm trên PATH của họ và gọi rabbitmqadmin là python.exe rabbitmqadmin.

Sau đó

  1. Duyệt http://{hostname}:15672/cli/rabbitmqadminđể tải về.
  2. Chuyển đến thư mục chứa sau đó chạy cmd với đặc quyền quản trị viên

Để liệt kê hàng đợi python rabbitmqadmin list queues .

Để xóa hàng đợi python rabbitmqadmin delete queue name=Name_of_queue

Để xóa tất cả hàng đợi

1- Chính sách khai báo

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

2- Xóa chính sách

python rabbitmqadmin  delete policy name='expire_all_policies'

0

Có một cách để loại bỏ tất cả các hàng đợi và trao đổi mà không có tập lệnh và thiết lập lại đầy đủ. Bạn chỉ có thể xóa và tạo lại một máy chủ ảo từ giao diện quản trị. Điều này sẽ làm việc ngay cả đối với vhost /.

Điều duy nhất bạn sẽ cần khôi phục là quyền cho vhost mới được tạo.


0

Được rồi, vòng loại quan trọng cho câu trả lời này: Câu hỏi không yêu cầu sử dụng rabbitmqctl HOẶC rabbitmqadmin để giải quyết vấn đề này, câu trả lời của tôi cần sử dụng cả hai. Ngoài ra, lưu ý rằng điều này đã được thử nghiệm trên MacOS 10.12.6 và các phiên bản của rabbitmqctlrabbitmqadmin được cài đặt khi cài đặt rabbitmq với Homebrew và được xác định brew list --versionsrabbitmq 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

Một tùy chọn khác là xóa vhost liên quan đến hàng đợi. Điều này sẽ xóa mọi thứ liên quan đến vhost, vì vậy hãy cảnh báo, nhưng nó rất dễ dàng và nhanh chóng.


LƯU Ý: đội RabbitMQ giám sát các rabbitmq-usersmailing list và chỉ thỉnh thoảng trả lời câu hỏi về StackOverflow.


0

Tôi đã thử các đoạn mã trên nhưng tôi không thực hiện bất kỳ phát trực tuyến nào.

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

Tôi tạo một tệp chứa tất cả các tên hàng đợi và các vòng lặp thông qua từng dòng để xóa chúng. Đối với các vòng lặp, while read ...đã không làm điều đó cho tôi. Nó luôn luôn dừng lại ở tên hàng đợi đầu tiên.


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

1
Tôi nhận được điều này khi chạy nó: head: số dòng bất hợp pháp - -1
Robert Ross

"Head -n-1" phải là "head -1" hoặc "head -n 1"
Gerd Busker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.