Deleting queues in RabbitMQ
I have a few queues running with RabbitMQ. A few of them are of no use now, how can I delete them? Unfortunatel开发者_C百科y I had not set the auto_delete
option.
If I set it now, will it be deleted?
Is there a way to delete those queues now?
If you do not care about the data in management database; i.e. users
, vhosts
, messages
etc., and neither about other queues
, then you can reset
via commandline by running the following commands in order:
WARNING: In addition to the queues, this will also remove any
users
andvhosts
, you have configured on your RabbitMQ server; and will delete any persistentmessages
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
The rabbitmq documentation says that the reset
command:
Returns a RabbitMQ node to its virgin state.
Removes the node from any cluster it belongs to, removes all data from the management database, such as configured users and vhosts, and deletes all persistent messages.
So, be careful using it.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.queue_delete(queue='queue-name')
connection.close()
Install pika package as follows
$ sudo pip install pika==0.9.8
The installation depends on pip and git-core packages, you may need to install them first.
On Ubuntu:
$ sudo apt-get install python-pip git-core
On Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
On Windows: To install easy_install, run the MS Windows Installer for setuptools
> easy_install pip
> pip install pika==0.9.8
In RabbitMQ versions > 3.0, you can also utilize the HTTP API if the rabbitmq_management plugin is enabled. Just be sure to set the content-type to 'application/json' and provide the vhost and queue name:
I.E. Using curl with a vhost 'test' and queue name '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
There is rabbitmqadmin which is nice to work from console.
If you ssh/log into server where you have rabbit installed, you can download it from:
http://{server}:15672/cli/rabbitmqadmin
and save it into /usr/local/bin/rabbitmqadmin
Then you can run
rabbitmqadmin -u {user} -p {password} -V {vhost} delete queue name={name}
Usually it requires sudo.
If you want to avoid typing your user name and password, you can use config
rabbitmqadmin -c /var/lib/rabbitmq/.rabbitmqadmin.conf -V {vhost} delete queue name={name}
All that under assumption that you have file ** /var/lib/rabbitmq/.rabbitmqadmin.conf** and have bare minumum
hostname = localhost
port = 15672
username = {user}
password = {password}
EDIT: As of comment from @user299709, it might be helpful to point out that user must be tagged as 'administrator' in rabbit. (https://www.rabbitmq.com/management.html)
A short summary for quick queue deletion with all default values from the host that is running RMQ server:
curl -O http://localhost:15672/cli/rabbitmqadmin
chmod u+x rabbitmqadmin
./rabbitmqadmin delete queue name=myQueueName
To delete all queues matching a pattern in a given vhost (e.g. containing 'amq.gen' in the root vhost):
rabbitmqctl -p / list_queues | grep 'amq.gen' | cut -f1 -d$'\t' | xargs -I % ./rabbitmqadmin -V / delete queue name=%
You assert that a queue exists (and create it if it does not) by using queue.declare. If you originally set auto-delete to false, calling queue.declare again with autodelete true will result in a soft error and the broker will close the channel.
You need to use queue.delete now in order to delete it.
See the API documentation for details:
- Java Client queueDelete
- .NET Client queueDelete
If you use another client, you'll need to find the equivalent method. Since it's part of the protocol, it should be there, and it's probably part of Channel or the equivalent.
You might also want to have a look at the rest of the documentation, in particular the Geting Started section which covers a lot of common use cases.
Finally, if you have a question and can't find the answer elsewhere, you should try posting on the RabbitMQ Discuss mailing list. The developers do their best to answer all questions asked there.
Another option would be to enable the management_plugin and connect to it over a browser. You can see all queues and information about them. It is possible and simple to delete queues from this interface.
I've generalized Piotr Stapp's JavaScript/jQuery method a bit further, encapsulating it into a function and generalizing it a bit.
This function uses the RabbitMQ HTTP API to query available queues in a given vhost
, and then delete them based on an optional 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)}
});
});
}
});
};
Once you paste this function in your browser's JavaScript console while on your RabbitMQ management page, you can use it like this:
Delete all queues in '/' vhost
deleteQueues('/');
Delete all queues in '/' vhost beginning with 'test'
deleteQueues('/', 'test');
Delete all queues in 'dev' vhost beginning with 'foo'
deleteQueues('dev', 'foo');
Please use this at your own risk!
install
$ sudo rabbitmq-plugins enable rabbitmq_management
and go to http://localhost:15672/#/queues if you are using localhost. the default password will be username: guest
, password: guest
and go to queues tab and delete the queue.
The management plugin (web interface) gives you a link to a python script. You can use it to delete queues. I used this pattern to remove a lot of queues:
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
Hopefully it might help someone.
I tried the above pieces of code but I did not do any streaming.
sudo rabbitmqctl list_queues | awk '{print $1}' > queues.txt; for line in $(cat queues.txt); do sudo rabbitmqctl delete_queue "$line"; done
.
I generate a file that contains all the queue names and loops through it line by line to the delete them. For the loops, while read ...
did not do it for me. It was always stopping at the first queue name.
Also, if you want to delete a single queue, the above solutions will help(python, Java ...) and also do sudo rabbitmqctl delete_queue queue_name
. I am using rabbitmqctl
instead of rabbitmqadmin
.
I use this alias in .profile
:
alias qclean="rabbitmqctl list_queues | python ~/bin/qclean.py"
where qclean.py
has the following code:
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()
Essentially, this is an iterative version of code of Shweta B. Patil.
With the rabbitmq_management plugin installed you can run this to delete all the unwanted queues:
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>/{}
Let's break the command down:
rabbitmqctl list_queues -p vhost_name
will list all the queues and how many task they have currently.
grep -v "fast\|medium\|slow"
will filter the queues you don't want to delete, let's say we want to delete every queue without the words fast, medium or slow.
tr "[:blank:]" " "
will normalize the delimiter on rabbitmqctl between the name of the queue and the amount of tasks there are
cut -d " " -f 1
will split each line by the whitespace and pick the 1st column (the queue name)
xargs -I {} curl -i -u guest:guest -H "content-type:application/json" -XDELETE http://localhost:15672/api/queues/<vhost>/{}
will pick up the queue name and will set it into where we set the {}
character deleting all queues not filtered in the process.
Be sure the user been used has administrator permissions.
I was struggling with finding an answer that suited my needs of manually delete a queue in rabbigmq. I therefore think it is worth mentioning in this thread that it is possible to delete a single queue without rabbitmqadmin
using the following command:
rabbitmqctl delete_queue <queue_name>
I did it different way, because I only had access to management webpage. I created simple "snippet" which delete queues in Javascript. Here it is:
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)}});
}
All my queues was in format: PREFIX_0001 to PREFIX_0XXX
If you are using C#, you can use HareDu API like so:
var result = await _services.GetService<IBrokerObjectFactory>()
.DeleteQueue("queue", "vhost");
...or
var result = await _services.GetService<IBrokerObjectFactory>()
.DeleteQueue("queue", "vhost", x =>
{
x.WhenHasNoConsumers();
x.WhenEmpty();
});
https://github.com/ahives/HareDu2/blob/master/docs/queue-delete.md
精彩评论