ฉันมีคิวสองสามคิวที่ทำงานกับ RabbitMQ ตอนนี้มีบางส่วนที่ไม่มีประโยชน์แล้วฉันจะลบออกได้อย่างไร น่าเสียดายที่ฉันไม่ได้ตั้งค่าauto_delete
ตัวเลือก
ถ้าตั้งตอนนี้จะลบไหม
ตอนนี้มีวิธีลบคิวเหล่านั้นหรือไม่?
ฉันมีคิวสองสามคิวที่ทำงานกับ RabbitMQ ตอนนี้มีบางส่วนที่ไม่มีประโยชน์แล้วฉันจะลบออกได้อย่างไร น่าเสียดายที่ฉันไม่ได้ตั้งค่าauto_delete
ตัวเลือก
ถ้าตั้งตอนนี้จะลบไหม
ตอนนี้มีวิธีลบคิวเหล่านั้นหรือไม่?
คำตอบ:
หากคุณไม่สนใจข้อมูลในฐานข้อมูลการจัดการ เช่นusers
, vhosts
, messages
ฯลฯ และไม่เกี่ยวกับคนอื่น ๆqueues
แล้วคุณสามารถreset
ผ่าน commandline โดยการเรียกใช้คำสั่งต่อไปในการสั่งซื้อ:
คำเตือน:นอกจากคิวแล้วสิ่งนี้จะลบใด ๆ
users
และvhosts
คุณได้กำหนดค่าบนเซิร์ฟเวอร์ RabbitMQ ของคุณด้วย และจะลบถาวรใด ๆmessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
เอกสาร rabbitmqบอกว่าreset
คำสั่ง:
ส่งคืนโหนด RabbitMQ เป็นสถานะบริสุทธิ์
ลบโหนดออกจากคลัสเตอร์ใด ๆ ที่เป็นสมาชิกลบข้อมูลทั้งหมดออกจากฐานข้อมูลการจัดการเช่นผู้ใช้ที่กำหนดค่าและ vhosts และลบข้อความที่มีอยู่ทั้งหมด
ดังนั้นโปรดใช้ความระมัดระวัง
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 ให้เรียกใช้ MS Windows Installer สำหรับ setuptools
> easy_install pip
> pip install pika==0.9.8
ในเวอร์ชัน RabbitMQ> 3.0 คุณยังสามารถใช้ HTTP API ได้หากเปิดใช้งานปลั๊กอิน rabbitmq_management อย่าลืมตั้งค่าประเภทเนื้อหาเป็น 'application / json' และระบุ vhost และชื่อคิว:
IE ใช้ curl กับ vhost 'test' และชื่อคิว 'testqueue':
$ 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
administrator
มิฉะนั้นจะไม่สามารถใช้บางส่วนของ API ได้
$ 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
อย่างไรก็ตามคิวยังคงอยู่ :( - ความคิดใด ๆ
มีrabbitmqadminซึ่งทำงานจากคอนโซลได้ดี
หากคุณ ssh / ล็อกอินเข้าสู่เซิร์ฟเวอร์ที่คุณติดตั้ง rabbit ไว้คุณสามารถดาวน์โหลดได้จาก:
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** และมี minumum เปล่า
hostname = localhost
port = 15672
username = {user}
password = {password}
แก้ไข: ตามความคิดเห็นของ @ user299709 อาจเป็นประโยชน์ที่จะชี้ให้เห็นว่าผู้ใช้ต้องถูกแท็กเป็น 'ผู้ดูแลระบบ' ในกระต่าย ( https://www.rabbitmq.com/management.html )
สรุปสั้น ๆ สำหรับการลบคิวอย่างรวดเร็วพร้อมค่าเริ่มต้นทั้งหมดจากโฮสต์ที่กำลังเรียกใช้เซิร์ฟเวอร์ RMQ:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
ในการลบคิวทั้งหมดที่ตรงกับรูปแบบใน vhost ที่กำหนด (เช่นมี 'amq.gen' ในรูท vhost):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
คุณยืนยันว่าคิวที่มีอยู่ (และสร้างมันถ้ามันไม่ได้) โดยใช้queue.declare หากคุณตั้งค่าการลบอัตโนมัติเป็นเท็จการเรียกใช้คิวประกาศอีกครั้งด้วยการลบอัตโนมัติจริงจะทำให้เกิดข้อผิดพลาดเล็กน้อยและนายหน้าจะปิดช่องนั้น
คุณต้องใช้que.delete ทันทีเพื่อที่จะลบมัน
ดูรายละเอียดในเอกสาร API:
หากคุณใช้ไคลเอนต์อื่นคุณจะต้องหาวิธีการที่เทียบเท่ากัน เนื่องจากเป็นส่วนหนึ่งของโปรโตคอลจึงควรอยู่ที่นั่นและอาจเป็นส่วนหนึ่งของ Channel หรือเทียบเท่า
คุณอาจต้องการดูเอกสารที่เหลือโดยเฉพาะในส่วนการเริ่มต้นใช้งานซึ่งครอบคลุมกรณีการใช้งานทั่วไปจำนวนมาก
สุดท้ายนี้หากคุณมีคำถามและหาคำตอบไม่ได้จากที่อื่นคุณควรลองโพสต์ในรายชื่อเมลของ RabbitMQ Discuss นักพัฒนาพยายามอย่างเต็มที่เพื่อตอบทุกคำถามที่ถามที่นั่น
อีกทางเลือกหนึ่งคือการเปิดใช้งาน management_plugin และเชื่อมต่อผ่านเบราว์เซอร์ คุณสามารถดูคิวและข้อมูลเกี่ยวกับคิวทั้งหมดได้ เป็นไปได้และง่ายในการลบคิวจากอินเทอร์เฟซนี้
ฉันได้กำหนดวิธีการ JavaScript / jQuery ของ Piotr Stapp ให้กว้างขึ้นอีกเล็กน้อยโดยห่อหุ้มให้เป็นฟังก์ชันและสรุปให้เป็นส่วนหนึ่ง
ฟังก์ชันนี้ใช้ 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)}
});
});
}
});
};
เมื่อคุณวางฟังก์ชั่นนี้ในคอนโซล JavaScript ของเบราว์เซอร์ขณะที่อยู่ในหน้าการจัดการ RabbitMQ คุณสามารถใช้งานได้ดังนี้:
ลบคิวทั้งหมดใน '/' vhost
deleteQueues('/');
ลบคิวทั้งหมดใน '/' vhost ที่ขึ้นต้นด้วย 'test'
deleteQueues('/', 'test');
ลบคิวทั้งหมดใน 'dev' vhost ที่ขึ้นต้นด้วย 'foo'
deleteQueues('dev', 'foo');
โปรดใช้สิ่งนี้โดยยอมรับความเสี่ยงของคุณเอง!
ปลั๊กอินการจัดการ (เว็บอินเตอร์เฟส) ให้ลิงก์ไปยังสคริปต์ 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
ฉันใช้นามแฝงนี้ใน.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
ติดตั้ง
$ sudo rabbitmq-plugins enable rabbitmq_management
และไปที่http: // localhost: 15672 / # / queuesหากคุณใช้ localhost รหัสผ่านเริ่มต้นจะเป็นusername: guest
, password: guest
และไปที่แท็บคิวและลบคิว
หวังว่ามันอาจจะช่วยใครบางคนได้
ฉันลองใช้โค้ดข้างต้น แต่ไม่ได้ทำการสตรีมใด ๆ
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
ฉันสร้างไฟล์ที่มีชื่อคิวทั้งหมดและวนซ้ำทีละบรรทัดเพื่อลบออก สำหรับลูปwhile read ...
ไม่ได้ทำเพื่อฉัน มันหยุดอยู่ที่ชื่อคิวแรกเสมอ
นอกจากนี้หากคุณต้องการลบคิวเดียวโซลูชันข้างต้นจะช่วยได้ (python, Java ... ) และdo sudo rabbitmqctl delete_queue queue_name
ด้วย ฉันใช้rabbitmqctl
แทนrabbitmqadmin
.
เมื่อติดตั้งปลั๊กอิน 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"
จะกรองคิวที่คุณไม่ต้องการที่จะลบสมมติว่าเราต้องการที่จะลบทุกคิวโดยไม่ต้องคำได้อย่างรวดเร็ว , ขนาดกลางหรือช้า
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>/{}
จะรับชื่อคิวและจะตั้งค่าในตำแหน่งที่เราตั้งค่า{}
อักขระลบคิวทั้งหมดที่ไม่ได้กรองในกระบวนการ
ตรวจสอบว่าผู้ใช้ที่ใช้มีสิทธิ์ระดับผู้ดูแลระบบ
ฉันทำวิธีที่แตกต่างออกไปเพราะฉันเข้าถึงหน้าเว็บการจัดการเท่านั้น ฉันสร้าง "snippet" แบบธรรมดาซึ่งจะลบคิวใน 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
ฉันกำลังดิ้นรนหาคำตอบที่ตรงกับความต้องการของฉันในการลบคิวด้วยตนเองใน rabbigmq ฉันจึงคิดว่าควรกล่าวถึงในเธรดนี้ว่าสามารถลบคิวเดียวได้โดยไม่ต้องrabbitmqadmin
ใช้คำสั่งต่อไปนี้:
rabbitmqctl delete_queue <queue_name>