RabbitMQ ile çalışan birkaç kuyruğum var. Birkaç tanesi artık işe yaramıyor, onları nasıl silebilirim? Maalesef bu auto_delete
seçeneği ayarlamadım .
Şimdi ayarlarsam silinir mi?
Bu kuyrukları şimdi silmenin bir yolu var mı?
Yanıtlar:
Yönetim veri tabanındaki verileri önemsemiyorsanız; yani users
, vhosts
, messages
vb ve ne hakkında diğer queues
, sonra da olabilir reset
sırayla aşağıdaki komutları çalıştırarak komut yoluyla:
UYARI: kuyruklar ek olarak, bu da olacak kaldırmak herhangi
users
vevhosts
size RabbitMQ sunucusunda yapılandırılmış olması; ve kalıcı olanları silecekmessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
RabbitMQ belgelerine diyor reset
komutu:
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.
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
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
administrator
aksi takdirde API'nin belirli bölümlerini kullanamazlar.
$ 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?
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 )
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=%
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.
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.
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 vhost
ve 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!
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
Yüklemek
$ sudo rabbitmq-plugins enable rabbitmq_management
ve localhost kullanıyorsanız http: // localhost: 15672 / # / queues adresine gidin . Varsayılan şifre olacak username: guest
, password: guest
ve kuyruklar sekmesine gidin ve kuyruğu silin.
Bu takma adı şurada kullanıyorum .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
qclean.py
aş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.
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 rabbitmqctl
yerine rabbitmqadmin
.
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 1
olacak 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.
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
Rabbigmq'de bir kuyruğu manuel olarak silme ihtiyaçlarıma uygun bir cevap bulmakta zorlanıyordum. Bu nedenle, bu başlıkta rabbitmqadmin
aş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>