Ho alcune code in esecuzione con RabbitMQ. Alcuni di loro non servono ora, come posso eliminarli? Purtroppo non avevo impostato l' auto_delete
opzione.
Se lo imposto adesso, verrà cancellato?
C'è un modo per eliminare quelle code adesso?
Risposte:
Se non ti interessano i dati nel database di gestione; vale a dire users
, vhosts
, messages
ecc, e non su altri queues
, allora si può reset
tramite riga di comando eseguendo i seguenti comandi in ordine:
ATTENZIONE: Oltre alle code, questo rimuoverà anche qualsiasi
users
evhosts
, che hai configurato sul tuo server RabbitMQ; e cancellerà qualsiasi file persistentemessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
La documentazione di rabbitmq dice che il reset
comando:
Restituisce un nodo RabbitMQ al suo stato vergine.
Rimuove il nodo da qualsiasi cluster a cui appartiene, rimuove tutti i dati dal database di gestione, come utenti configurati e vhost, ed elimina tutti i messaggi persistenti.
Quindi, fai attenzione ad usarlo.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.queue_delete(queue='queue-name')
connection.close()
Installa il pacchetto pika come segue
$ sudo pip install pika==0.9.8
L'installazione dipende dai pacchetti pip e git-core, potrebbe essere necessario installarli prima.
Su Ubuntu:
$ sudo apt-get install python-pip git-core
Su Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
Su Windows: per installare easy_install, esegui MS Windows Installer per setuptools
> easy_install pip
> pip install pika==0.9.8
Nelle versioni RabbitMQ> 3.0, puoi anche utilizzare l'API HTTP se il plug-in rabbitmq_management è abilitato. Assicurati solo di impostare il tipo di contenuto su 'application / json' e di fornire il vhost e il nome della coda:
IE Utilizzo di curl con un vhost 'test' e il nome della coda '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
altrimenti non potrà utilizzare alcune parti dell'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
Tuttavia la coda rimane ancora :( - qualche idea?
C'è rabbitmqadmin che è bello lavorare da console.
Se accedi con ssh / al server su cui hai installato rabbit, puoi scaricarlo da:
http://{server}:15672/cli/rabbitmqadmin
e salvalo in / usr / local / bin / rabbitmqadmin
Allora puoi correre
rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Di solito richiede sudo.
Se vuoi evitare di digitare il tuo nome utente e la tua password, puoi usare config
rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
Tutto ciò presupponendo che tu abbia il file ** /var/lib/rabbitmq/.rabbitmqadmin.conf** e abbia un minimo minimo
hostname = localhost
port = 15672
username = {user}
password = {password}
EDIT: A partire dal commento di @ user299709, potrebbe essere utile sottolineare che l'utente deve essere etichettato come "amministratore" in rabbit. ( https://www.rabbitmq.com/management.html )
Un breve riepilogo per l'eliminazione rapida della coda con tutti i valori predefiniti dall'host che esegue il server RMQ:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
Per eliminare tutte le code che corrispondono a un modello in un dato vhost (es. Contenente 'amq.gen' nel vhost root):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Asserisci che esiste una coda (e la crei se non esiste) utilizzando queue.declare . Se originariamente hai impostato la cancellazione automatica su false, chiamando di nuovo queue.declare con autodelete true si verificherà un errore soft e il broker chiuderà il canale.
Devi usare queue.delete ora per eliminarlo.
Consulta la documentazione API per i dettagli:
Se utilizzi un altro client, dovrai trovare il metodo equivalente. Dato che fa parte del protocollo, dovrebbe esserci, e probabilmente fa parte di Channel o equivalente.
Potresti anche voler dare un'occhiata al resto della documentazione, in particolare alla Guida introduttiva sezione che copre molti casi d'uso comuni.
Infine, se hai una domanda e non riesci a trovare la risposta altrove, dovresti provare a postare sulla mailing list di RabbitMQ Discuss . Gli sviluppatori fanno del loro meglio per rispondere a tutte le domande poste lì.
Un'altra opzione potrebbe essere quella di abilitare management_plugin e connettersi ad esso tramite un browser. Puoi vedere tutte le code e le informazioni su di esse. È possibile e semplice eliminare le code da questa interfaccia.
Ho generalizzato ulteriormente il metodo JavaScript / jQuery di Piotr Stapp, incapsulandolo in una funzione e generalizzandolo un po '.
Questa funzione utilizza l'API HTTP RabbitMQ per interrogare le code disponibili in un dato vhost
e quindi eliminarle in base a un facoltativo 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)}
});
});
}
});
};
Dopo aver incollato questa funzione nella console JavaScript del tuo browser mentre sei nella pagina di gestione di RabbitMQ, puoi usarla in questo modo:
Elimina tutte le code in "/" vhost
deleteQueues('/');
Elimina tutte le code in "/" vhost che iniziano con "test"
deleteQueues('/', 'test');
Elimina tutte le code in vhost "dev" che iniziano con "foo"
deleteQueues('dev', 'foo');
Si prega di utilizzare questo a proprio rischio!
Il plug-in di gestione (interfaccia web) fornisce un collegamento a uno script Python. Puoi usarlo per eliminare le code. Ho usato questo modello per rimuovere molte code:
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
Uso questo alias in .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
dove qclean.py
ha il seguente codice:
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()
Essenzialmente, questa è una versione iterativa del codice di Shweta B. Patil.
installare
$ sudo rabbitmq-plugins enable rabbitmq_management
e vai su http: // localhost: 15672 / # / queues se stai usando localhost. la password predefinita sarà username: guest
, password: guest
e vai alla scheda code ed elimina la coda.
Si spera che possa aiutare qualcuno.
Ho provato i pezzi di codice sopra ma non ho fatto alcun streaming.
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
Genero un file che contiene tutti i nomi delle code e lo faccio scorrere riga per riga per eliminarli. Per i loop,while read ...
non l'ho fatto per me. Si fermava sempre al primo nome della coda.
Inoltre, se vuoi eliminare una singola coda, le soluzioni di cui sopra ti aiuteranno (python, Java ...) e anche do sudo rabbitmqctl delete_queue queue_name
. Sto usando rabbitmqctl
invece di rabbitmqadmin
.
Con il plug-in rabbitmq_management installato puoi eseguirlo per eliminare tutte le code indesiderate:
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>/{}
Analizziamo il comando:
rabbitmqctl list_queues -p vhost_name
elencherà tutte le code e quante attività hanno attualmente.
grep -v "fast\|medium\|slow"
filtrerà le code che non vuoi eliminare, diciamo che vogliamo eliminare ogni coda senza le parole veloce , medio o lento .
tr "[:blank:]" " "
normalizzerà il delimitatore su rabbitmqctl tra il nome della coda e la quantità di attività presenti
cut -d " " -f 1
sarà dividere ogni riga dal spazi e scegliere la prima colonna (il nome della coda)
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}
prenderà il nome della coda e lo imposterà dove abbiamo impostato il {}
carattere eliminando tutte le code non filtrate nel processo.
Assicurati che l'utente utilizzato disponga delle autorizzazioni di amministratore.
L'ho fatto in modo diverso, perché avevo accesso solo alla pagina web di gestione. Ho creato un semplice "snippet" che elimina le code in Javascript. Ecco qui:
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)}});
}
Tutte le mie code erano nel formato: da PREFIX_0001 a PREFIX_0XXX