Mam kilka kolejek uruchomionych z RabbitMQ. Kilka z nich jest teraz bezużytecznych, jak mogę je usunąć? Niestety nie ustawiłem tej auto_delete
opcji.
Jeśli ustawię to teraz, czy zostanie usunięte?
Czy jest sposób, aby teraz usunąć te kolejki?
Odpowiedzi:
Jeśli nie dbasz o dane w bazie danych zarządzania; czyli users
, vhosts
, messages
itd., a nie o innych queues
, wtedy można reset
za pomocą poleceń, uruchamiając następujące polecenia w kolejności:
OSTRZEŻENIE: Oprócz kolejek, spowoduje to również usunięcie wszystkich
users
ivhosts
, które skonfigurowałeś na swoim serwerze RabbitMQ; i usunie wszystkie trwałe plikimessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Dokumentacja rabbitmq mówi, że reset
polecenie:
Przywraca węzeł RabbitMQ do stanu pierwotnego.
Usuwa węzeł z dowolnego klastra, do którego należy, usuwa wszystkie dane z bazy danych zarządzania, takie jak skonfigurowani użytkownicy i hosty wirtualne, oraz wszystkie trwałe komunikaty.
Więc uważaj, używając go.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.queue_delete(queue='queue-name')
connection.close()
Zainstaluj pakiet pika w następujący sposób
$ sudo pip install pika==0.9.8
Instalacja zależy od pakietów pip i git-core, być może trzeba będzie je najpierw zainstalować.
W systemie Ubuntu:
$ sudo apt-get install python-pip git-core
W Debianie:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
W systemie Windows: Aby zainstalować easy_install, uruchom Instalatora MS Windows dla setuptools
> easy_install pip
> pip install pika==0.9.8
W wersjach RabbitMQ> 3.0 można również używać interfejsu API HTTP, jeśli włączona jest wtyczka rabbitmq_management. Po prostu pamiętaj, aby ustawić typ zawartości na „application / json” i podać nazwę vhosta i kolejki:
IE Używanie curl z "test" vhosta i nazwą kolejki "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
przeciwnym razie nie będzie mógł używać niektórych części interfejsu 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
Jednak kolejka nadal pozostaje :( - jakieś pomysły?
Jest rabbitmqadmin, który jest przyjemny do pracy z konsoli.
Jeśli zalogujesz się przez ssh / do serwera, na którym masz zainstalowanego królika, możesz go pobrać z:
http://{server}:15672/cli/rabbitmqadmin
i zapisz go w / usr / local / bin / rabbitmqadmin
Wtedy możesz biec
rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Zwykle wymaga sudo.
Jeśli chcesz uniknąć wpisywania nazwy użytkownika i hasła, możesz użyć config
rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
Wszystko to przy założeniu, że masz plik ** /var/lib/rabbitmq/.rabbitmqadmin.conf** i masz gołe minumum
hostname = localhost
port = 15672
username = {user}
password = {password}
EDYCJA: Od komentarza @ user299709, pomocne może być wskazanie, że użytkownik musi być oznaczony jako „administrator” w króliku. ( https://www.rabbitmq.com/management.html )
Krótkie podsumowanie dotyczące szybkiego usuwania kolejki ze wszystkimi wartościami domyślnymi z hosta, na którym działa serwer RMQ:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
Aby usunąć wszystkie kolejki pasujące do wzorca w danym vhostie (np. Zawierające „amq.gen” w głównym vhostie):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
Twierdzisz, że kolejka istnieje (i tworzysz ją, jeśli tak nie jest) za pomocą queue.declare . Jeśli pierwotnie ustawiłeś automatyczne usuwanie na fałsz, ponowne wywołanie queue.declare z autodelete true spowoduje wystąpienie miękkiego błędu i broker zamknie kanał.
Musisz teraz użyć queue.delete , aby go usunąć.
Więcej informacji znajdziesz w dokumentacji API:
Jeśli używasz innego klienta, musisz znaleźć równoważną metodę. Ponieważ jest częścią protokołu, powinien tam być i prawdopodobnie jest częścią kanału lub jego odpowiednika.
Możesz również zajrzeć do pozostałej części dokumentacji, w szczególności do sekcji Rozpoczęcie pracy, która obejmuje wiele typowych przypadków użycia.
Wreszcie, jeśli masz pytanie i nie możesz znaleźć odpowiedzi gdzie indziej, spróbuj opublikować post na liście mailingowej RabbitMQ Discuss . Deweloperzy starają się odpowiedzieć na wszystkie zadawane tam pytania.
Inną opcją byłoby włączenie management_plugin i połączenie się z nim przez przeglądarkę. Możesz zobaczyć wszystkie kolejki i informacje o nich. Z poziomu tego interfejsu możliwe i proste jest usuwanie kolejek.
Metodę JavaScript / jQuery Piotra Stappa uogólniłem nieco dalej, hermetyzując ją w funkcję i nieco uogólniając.
Ta funkcja używa RabbitMQ HTTP API do odpytywania dostępnych kolejek w danym vhost
, a następnie usuwa je na podstawie opcjonalnego 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)}
});
});
}
});
};
Po wklejeniu tej funkcji w konsoli JavaScript przeglądarki na stronie zarządzania RabbitMQ możesz jej używać w następujący sposób:
Usuń wszystkie kolejki w „/” vhost
deleteQueues('/');
Usuń wszystkie kolejki w „/” vhost zaczynające się od „test”
deleteQueues('/', 'test');
Usuń wszystkie kolejki w „dev” vhost zaczynające się od „foo”
deleteQueues('dev', 'foo');
Używaj tego na własne ryzyko!
Wtyczka zarządzająca (interfejs sieciowy) udostępnia łącze do skryptu w języku Python. Możesz go użyć do usuwania kolejek. Użyłem tego wzorca do usunięcia wielu kolejek:
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
Używam tego aliasu w .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
gdzie qclean.py
ma następujący kod:
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()
Zasadniczo jest to iteracyjna wersja kodu Shwety B. Patil.
zainstalować
$ sudo rabbitmq-plugins enable rabbitmq_management
i przejdź do http: // localhost: 15672 / # / queues, jeśli używasz localhost. domyślne hasło będzie username: guest
, password: guest
i przejdź do zakładki kolejek i usunąć kolejkę.
Miejmy nadzieję, że może to komuś pomóc.
Wypróbowałem powyższe fragmenty kodu, ale nie wykonałem żadnego przesyłania strumieniowego.
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
Generuję plik, który zawiera wszystkie nazwy kolejek i przechodzę przez niego wiersz po wierszu, aby je usunąć. W przypadku pętliwhile read ...
nie zrobiłem tego za mnie. Zawsze zatrzymywał się na pierwszej nazwie kolejki.
Ponadto, jeśli chcesz usunąć pojedynczą kolejkę, powyższe rozwiązania pomogą (python, Java ...), a także do sudo rabbitmqctl delete_queue queue_name
. Używam rabbitmqctl
zamiast rabbitmqadmin
.
Po zainstalowaniu wtyczki rabbitmq_management możesz uruchomić to, aby usunąć wszystkie niechciane kolejki:
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>/{}
Złóżmy polecenie:
rabbitmqctl list_queues -p vhost_name
wyświetli listę wszystkich kolejek i liczbę aktualnie wykonanych zadań.
grep -v "fast\|medium\|slow"
przefiltruje kolejki, których nie chcesz usunąć, powiedzmy, że chcemy usunąć każdą kolejkę bez słów szybko , średnio lub wolno .
tr "[:blank:]" " "
znormalizuje ogranicznik w rabbitmqctl między nazwą kolejki a liczbą zadań
cut -d " " -f 1
podzieli każdą linię białymi znakami i wybierze pierwszą kolumnę (nazwę kolejki)
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}
odbierze nazwę kolejki i ustawi ją w miejscu, w którym ustawimy {}
znak, usuwając wszystkie kolejki niefiltrowane w procesie.
Upewnij się, że użyty użytkownik ma uprawnienia administratora.
Zrobiłem to inaczej, bo miałem tylko dostęp do strony zarządzania. Stworzyłem prosty "fragment", który usuwa kolejki w Javascript. Oto ona:
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)}});
}
Wszystkie moje kolejki były w formacie: od PREFIX_0001 do PREFIX_0XXX
Miałem trudności ze znalezieniem odpowiedzi, która odpowiadałaby moim potrzebom, czyli ręcznego usunięcia kolejki w rabbigmq. Dlatego myślę, że warto wspomnieć w tym wątku, że można usunąć pojedynczą kolejkę bez rabbitmqadmin
użycia następującego polecenia:
rabbitmqctl delete_queue <queue_name>