RabbitMQ'da kuyrukları silme


93

RabbitMQ ile çalışan birkaç kuyruğum var. Birkaç tanesi artık işe yaramıyor, onları nasıl silebilirim? Maalesef bu auto_deleteseçeneği ayarlamadım .

Şimdi ayarlarsam silinir mi?

Bu kuyrukları şimdi silmenin bir yolu var mı?

Yanıtlar:


121

Yönetim veri tabanındaki verileri önemsemiyorsanız; yani users, vhosts, messagesvb ve ne hakkında diğer queues, sonra da olabilir resetsırayla aşağıdaki komutları çalıştırarak komut yoluyla:

UYARI: kuyruklar ek olarak, bu da olacak kaldırmak herhangi usersve vhostssize RabbitMQ sunucusunda yapılandırılmış olması; ve kalıcı olanları silecekmessages

rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app

RabbitMQ belgelerine diyor resetkomutu:

Bir RabbitMQ düğümünü bakir durumuna döndürür.

Düğümü ait olduğu herhangi bir kümeden kaldırır, yapılandırılmış kullanıcılar ve sankonlar gibi tüm verileri yönetim veritabanından kaldırır ve tüm kalıcı mesajları siler.

Bu yüzden kullanırken dikkatli olun.


46
UYARI: Bu ayrıca tavşan sunucunuzda yapılandırdığınız tüm kullanıcıları ve sankonları da silecektir. Bunu zor yoldan buldum :)
mafrosis

Oops, bunun için üzgünüm. Rabbitmq ile çalıştığım sırada gerçekten basit bir konfigürasyona sahip olduğum için fark etmedim. Cevabı güncelleyeceğim. Teşekkürler!
Faruk Sahin

3
bu gerçekten aşırı bir cevap. kuyrukları "silmek" için "sunucuyu kapat ve diski temizle" de diyebilirsiniz.
RubyTuesdayDONO

30
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
               'localhost'))
channel = connection.channel()

channel.queue_delete(queue='queue-name')

connection.close()

Pika paketini aşağıdaki gibi kurun

$ sudo pip install pika==0.9.8

Kurulum pip ve git-core paketlerine bağlıdır, önce bunları kurmanız gerekebilir.

Ubuntu'da:

$ sudo apt-get install python-pip git-core

Debian'da:

$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip

Windows'ta: easy_install yüklemek için kurulum araçları için MS Windows Installer'ı çalıştırın.

> easy_install pip
> pip install pika==0.9.8

Zaten pika ile çalışanlar için kesinlikle daha kolay, çok teşekkürler
m.raynal

27

RabbitMQ> 3.0 sürümlerinde, rabbitmq_management eklentisi etkinleştirilmişse HTTP API'yi de kullanabilirsiniz. İçerik türünü 'application / json' olarak ayarladığınızdan ve vhost ve kuyruk adını sağladığınızdan emin olun:

IE curl'yi bir sankon 'test' ve sıra adı 'testqueue' ile kullanma:

$ 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

1
Kullanıcınızın etiketlendiğinden emin olun, administratoraksi takdirde API'nin belirli bölümlerini kullanamazlar.
ubershmekel

1
Anlıyorum: $ 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 Ancak sıra hala duruyor :( - herhangi bir fikir?
Hackeron

23

Orada rabbitmqadmin konsolundan işin güzel.

Rabbit'i kurduğunuz sunucuda ssh / oturum açarsanız, onu şuradan indirebilirsiniz:

http://{server}:15672/cli/rabbitmqadmin

ve / usr / local / bin / rabbitmqadmin içine kaydedin

O zaman koşabilirsin

rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}

Genellikle sudo gerektirir.

Kullanıcı adınızı ve şifrenizi yazmaktan kaçınmak istiyorsanız, config kullanabilirsiniz.

rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}

Tüm bunlar, ** /var/lib/rabbitmq/.rabbitmqadmin.conf** dosyasına sahip olduğunuz ve minimum miktarda

hostname = localhost
port = 15672
username = {user}
password = {password}

DÜZENLEME: @ user299709'dan gelen yorum itibariyle, kullanıcının tavşanda 'yönetici' olarak etiketlenmesi gerektiğini belirtmek faydalı olabilir. ( https://www.rabbitmq.com/management.html )


bu, "Bağlanılamadı: [Errno 111] Bağlantı, neler olup bittiğini görmek için hata ayıklamanın herhangi bir yolu için reddedildi" döndürür?
user299709

Kimlik doğrulama günlüklerini, tavşan günlüklerini kontrol edin ... Kullanıcının VHost üzerinde çalışma izni olmayabilir ... Nereden başlayacağımı söylemek zor
Lukino

çözüm, kullanıcıyı 'yönetici' etiketiyle
ayarlıyordu

16

RMQ sunucusunu çalıştıran ana bilgisayardaki tüm varsayılan değerlerle hızlı kuyruk silme için kısa bir özet:

curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName

Belirli bir sankondaki bir örüntüyle eşleşen tüm kuyrukları silmek için (örneğin, kök sankonda 'amq.gen' içeren):

rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%

15

Queue.declare kullanarak bir kuyruğun var olduğunu (ve yoksa oluşturduğunu) varsayarsınız . Başlangıçta otomatik silmeyi false olarak ayarladıysanız, queue.declare'yi autodelete true ile tekrar çağırmak hafif bir hataya neden olur ve aracı kanalı kapatır.

Silmek için queue.delete'yi şimdi kullanmanız gerekiyor.

Ayrıntılar için API belgelerine bakın:

Başka bir müşteri kullanıyorsanız, eşdeğer yöntemi bulmanız gerekir. Protokolün bir parçası olduğu için orada olması gerekir ve muhtemelen Kanalın bir parçası veya eşdeğeridir.

Belgelerin geri kalanına, özellikle de birçok yaygın kullanım durumunu kapsayan Başlarken bölümüne de göz atmak isteyebilirsiniz .

Son olarak, bir sorunuz varsa ve yanıtı başka bir yerde bulamıyorsanız, RabbitMQ Tartışma posta listesine yazmayı denemelisiniz . Geliştiriciler, orada sorulan tüm soruları yanıtlamak için ellerinden geleni yaparlar.


10

Diğer bir seçenek, management_plugin'i etkinleştirmek ve ona bir tarayıcı üzerinden bağlanmak olabilir. Tüm kuyrukları ve bunlarla ilgili bilgileri görebilirsiniz. Bu arayüzden kuyrukları silmek mümkün ve basittir.


Bunu yaptım ancak management_plugin'im komut satırı arayüzümden farklı bir durumda
Sweet Chilly Philly

9

Piotr Stapp'ın JavaScript / jQuery yöntemini biraz daha genelleştirdim, onu bir fonksiyona dönüştürdüm ve biraz genelleştirdim.

Bu işlev, belirli bir sıradaki mevcut sıraları sorgulamak vhostve ardından isteğe bağlı olarak bunları silmek için RabbitMQ HTTP API'yi kullanır 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)}
                });
            });
        }
    });
};

Bu işlevi, RabbitMQ yönetim sayfanızdayken tarayıcınızın JavaScript konsoluna yapıştırdıktan sonra, şu şekilde kullanabilirsiniz:

'/' Vhost'taki tüm kuyrukları sil

deleteQueues('/');

'/' Vhost'taki 'test' ile başlayan tüm kuyrukları sil

deleteQueues('/', 'test');

"Dev" vhost'taki "foo" ile başlayan tüm kuyrukları sil

deleteQueues('dev', 'foo');

Lütfen bunu kendi sorumluluğunuzda kullanın!


1
Bu, yalnızca web yöneticisini kullanarak aynı ön eke sahip çok sayıda kuyruğu kaldırmak için mükemmel bir şekilde çalıştı. Teşekkürler!
espenoh

6

Yönetim eklentisi (web arayüzü) size bir python betiğine bağlantı verir. Kuyrukları silmek için kullanabilirsiniz. Bu kalıbı birçok kuyruğu kaldırmak için kullandım:

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


5

Bu takma adı şurada kullanıyorum .profile:

alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"

qclean.pyaşağıdaki kod nerede bulunur :

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()

Esasen, bu Shweta B. Patil kodunun yinelemeli bir sürümüdür.


5

Umarım birine yardımcı olabilir.

Yukarıdaki kod parçalarını denedim ama herhangi bir akış yapmadım.

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

Tüm kuyruk adlarını içeren bir dosya oluşturuyorum ve bunları silmek için satır satır üzerinden geçiyorum. Döngüler içinwhile read ... için, benim için yapmadım. Her zaman ilk sıra adında duruyordu.

Ayrıca, tek bir kuyruğu silmek istiyorsanız, yukarıdaki çözümler (python, Java ...) ve ayrıca yardımcı olacaktır do sudo rabbitmqctl delete_queue queue_name. Ben kullanıyorum rabbitmqctlyerine rabbitmqadmin.


4

Rabbitmq_management eklentisi yüklüyken, tüm istenmeyen kuyrukları silmek için bunu çalıştırabilirsiniz:

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

Komutu parçalayalım:

rabbitmqctl list_queues -p vhost_name tüm kuyrukları ve şu anda kaç göreve sahip olduklarını listeler.

grep -v "fast\|medium\|slow"silmek istemediğiniz kuyrukları filtreleyecek, diyelim ki hızlı , orta veya yavaş kelimeleri olmadan her kuyruğu silmek istiyoruz .

tr "[:blank:]" " " kuyruğun adı ve var olan görev miktarı arasında tavşanmqctl üzerindeki sınırlayıcıyı normalleştirecek

cut -d " " -f 1olacak bölünmüş boşluk her satırı ve 1 kolon (sıra adı) almak

xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}kuyruk adını alacak {}ve işlemde filtrelenmemiş tüm kuyrukları silerek karakteri belirlediğimiz yere ayarlayacaktır .

Kullanılmış olan kullanıcının yönetici izinlerine sahip olduğundan emin olun.


İlham için @phriscage'e teşekkürler :)
Hassek

2

Farklı bir şekilde yaptım, çünkü sadece yönetim web sayfasına erişimim vardı. Javascript'te sıraları silen basit bir "snippet" oluşturdum. İşte burada:

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

Tüm kuyruklarım şu formattaydı: PREFIX_0001 - PREFIX_0XXX


1

Rabbigmq'de bir kuyruğu manuel olarak silme ihtiyaçlarıma uygun bir cevap bulmakta zorlanıyordum. Bu nedenle, bu başlıkta rabbitmqadminaşağıdaki komutu kullanmadan tek bir kuyruğu silmenin mümkün olduğunu belirtmeye değer olduğunu düşünüyorum :

rabbitmqctl delete_queue <queue_name>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.