88

If I have RabbitMQ installed on my machine, is there a way to create a message queue from the command line and bind it to a certain exchange without using a client?

I think it is not possible, but I want to be sure.

Pang
  • 9,564
  • 146
  • 81
  • 122
Fanooos
  • 2,718
  • 5
  • 31
  • 55

12 Answers12

145

Summary:

Other answers are good alternatives to what was asked for. Below are commands you can use from the command line.

First, do all the necessary prep work, e.g. install rabbit, rabbitmqadmin, and rabbitctl. The idea is to use commands from rabbitmqctl and rabbitmqadmin. You can see some command examples: https://www.rabbitmq.com/management-cli.html

Example Commands/Setup:

The following commands should give you the majority if not all of what you need:

# Get the cli and make it available to use.
wget http://127.0.0.1:15672/cli/rabbitmqadmin
chmod +x rabbitmqadmin
mv rabbitmqadmin /etc/rabbitmq

Add a user and permissions

rabbitmqctl add_user testuser testpassword
rabbitmqctl set_user_tags testuser administrator
rabbitmqctl set_permissions -p / testuser ".*" ".*" ".*"

Make a virtual host and Set Permissions

rabbitmqctl add_vhost Some_Virtual_Host
rabbitmqctl set_permissions -p Some_Virtual_Host guest ".*" ".*" ".*"

Make an Exchange

./rabbitmqadmin declare exchange --vhost=Some_Virtual_Host name=some_exchange type=direct

Make a Queue

./rabbitmqadmin declare queue --vhost=Some_Virtual_Host name=some_outgoing_queue durable=true

Make a Binding

./rabbitmqadmin --vhost="Some_Virtual_Host" declare binding source="some_exchange" destination_type="queue" destination="some_incoming_queue" routing_key="some_routing_key"

Alternative Way to Bind with Python

The following is an alternative to command line binding, as I've had issues with it sometimes and found the following python code to be more reliable.

#!/usr/bin/env python
import pika

rabbitmq_host = "127.0.0.1"
rabbitmq_port = 5672
rabbitmq_virtual_host = "Some_Virtual_Host"
rabbitmq_send_exchange = "some_exchange" 
rabbitmq_rcv_exchange = "some_exchange"
rabbitmq_rcv_queue = "some_incoming_queue"
rabbitmq_rcv_key = "some_routing_key"

outgoingRoutingKeys = ["outgoing_routing_key"]
outgoingQueues = ["some_outgoing_queue "]

# The binding area
credentials = pika.PlainCredentials(rabbitmq_user, rabbitmq_password)
connection = pika.BlockingConnection(pika.ConnectionParameters(rabbitmq_host, rabbitmq_port, rabbitmq_virtual_host, credentials))
channel = connection.channel()
channel.queue_bind(exchange=rabbitmq_rcv_exchange, queue=rabbitmq_rcv_queue, routing_key=rabbitmq_rcv_key)

for index in range(len(outgoingRoutingKeys)):
    channel.queue_bind(exchange=rabbitmq_send_exchange, queue=outgoingQueues[index], routing_key=outgoingRoutingKeys[index])

The above can be run as part of a script using python. Notice I put the outgoing stuff into arrays, which will allow you to iterate through them. This should make things easy for deploys.

Last Thoughts

I think the above should get you moving in the right direction, use google if any specific commands don't make sense or read more with rabbitmqadmin help subcommands. I tried to use variables that explain themselves.

starball
  • 20,030
  • 7
  • 43
  • 238
James Oravec
  • 19,579
  • 27
  • 94
  • 160
  • 1
    Great! thanks for the step by step guide. In case rabbitmqadmin is throwing Access refused error, consider adding '-u testuser -p testpassword' at the end of command. – Winster Mar 02 '20 at 15:01
31

Install the RabbitMQ management plugin. It comes with a command line tool which you can use to configure all of your queues/exchanges/etc.

OJ.
  • 28,944
  • 5
  • 56
  • 71
  • 4
    Can you expand on this a bit? Visiting that page doesn't reveal anything like what you've described. Are you talking about the `load_definitions` variable and corresponding file? Or the description of using the HTTP API with `curl`? I was hoping for something a little more user-friendly than manually building http reqs. – Aaron Dufour Jul 01 '14 at 18:17
  • 2
    To answer my own question, use `rabbitmqadmin` on the command line. `rabbitmqadmin help subcommands` seems to be the best documentation. – Aaron Dufour Jul 14 '14 at 18:19
26

Create Exchange:

rabbitmqadmin -u {user} -p {password} -V {vhost} declare exchange name={name} type={type}

Create Queue:

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

Bind Queue to Exchange:

rabbitmqadmin -u {user} -p {password} -V {vhost} declare binding source={Exchange} destination={queue}
Pang
  • 9,564
  • 146
  • 81
  • 122
Kaushal Dontula
  • 269
  • 3
  • 6
9

Maybe a little late to the party but I've done so using CURL.

For queues:

curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" \
-XPUT -d'{"durable":true}' \
http://192.168.99.100:15672/api/queues/%2f/QUEUENAME

And for bindings

curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" \
-XPOST -d"{\"routing_key\":\"QUEUENAME\"}" \
http://192.168.99.100:15672/api/bindings/%2f/e/EXCHANGENAME/q/QUEUENAME

Note 192.168.99.100:15672 points to my RMQ Management

userMod2
  • 8,312
  • 13
  • 63
  • 115
  • Only this helped me... Added this inside my DockerFile... works like a charm. Thank you. :-) – We are Borg Feb 05 '20 at 09:29
  • This returned 404 for me but this worked: ```curl -i -u RABBITUSER:RABBITPASSWORD -H "content-type:application/json" -XPUT -d'{"durable":true}' http://localhost:15672/rabbitmq/api/queues/%2f/QUEUENAME``` – Vladimir Apr 23 '21 at 14:33
8

If you are using Linux Debian, there's a package called amqp-tools. Install it with

apt-get install amqp-tools

You can then use command line such as amqp-publish to send messages to your queue

amqp-publish -e exchange_name -b "your message"

Then you can collect message(s) from the queue using

amqp-get -q queue_name

or

amqp-consume -q queue_name

There are also (command line) examples from rabbitmq-c package / library. After you build it, you can send messages through command line such as

amqp_sendstring localhost 5672 amq.direct test "hello world"

Have fun ...

Vadzim
  • 24,954
  • 11
  • 143
  • 151
rahard
  • 81
  • 1
  • 3
4

rabbitmqctl, the provided command line interface, doesn't expose the ability to create a queue and bind it.

It, however, is quite trivial to do it with a quick script though, and the RabbitMQ getting started guide shows several examples of it, both on the publisher as well as the consumer side.

#do some work to connect
#do some work to open a channel
channel.queue_declare(queue='helloworld')

I'm glossing over connecting, but it's a literal one liner to create a queue. The operation is also idempotent, meaning you can include the statement in a script and be safe, knowing that it won't keep recreating the queue or blowing out an existing one of the same name.

Pang
  • 9,564
  • 146
  • 81
  • 122
bakasan
  • 2,262
  • 2
  • 26
  • 33
3

Create RabbitMq Exchange, Queue and Bindings dynamically from CLI on Windows

I already had a RabbitMQ Server installed and running with multiple queue and exchange and now wanted to create it on the fly from command line. I know it is an old question but I thought giving out this information will be helpful.

Following is what I did:

Setup

  1. Downloaded and installed Python 2.6.6-201008-24 Windows x86-64 MSI installer , any version of python,
  2. Download RabbitMqAdmin: RabbitMq Web User Interface has a link Command Line which navigates to http://server-name:15672/cli/ (server-name: server on which rabbitmq is installed) alternatively,use the above url and save the file as rabbitmqadmin.exe in the python exe location

eg: C:\Python26
C:\Python26\python C:\Python26\rabbitmqadmin.exe

Code:in a batch file used the below commands

  1. Create exchange:
c:\python26\python.exe rabbitmqadmin.exe declare exchange name=*ExchangeName1* type=topic durable=true
  1. Create queue:
c:\python26\python.exe rabbitmqadmin.exe declare queue name=*NameofQueue1* durable=true
  1. Create binding:
c:\python26\python.exe rabbitmqadmin.exe declare binding source=ExchangeName1 destination_type=queue destination=*NameofQueue1* routing_key=*RoutingKey1*

by executing rabbitmqadmin.exe -help -subcommands it lists all the available commands

eg: c:\python26\python.exe rabbitmqadmin.exe -help -subcommands

Obum
  • 1,485
  • 3
  • 7
  • 20
Milli
  • 74
  • 4
0

Here is a more minimal Python example, taken from the RabbitMQ Python tutorial.

First, install pika:

sudo easy_install pika
# (or use pip)

This is all you need to send a message to localhost:

import pika

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

channel.queue_declare(queue='test-queue')
channel.basic_publish(exchange='', routing_key='test-queue', body='Hello World!')
Pang
  • 9,564
  • 146
  • 81
  • 122
Steve Rukuts
  • 9,167
  • 3
  • 50
  • 72
0

For me, my RabbitMQ Management deal kept trying to redirect to the https version... everything in my setup is vanilla, I don't even have a config file... anyways, my work around was to manually create rabbitmqadmin.py in the sbin folder, then fill it with https://raw.githubusercontent.com/rabbitmq/rabbitmq-management/v3.8.1/bin/rabbitmqadmin

Then, make sure that python is in your PATH and run this to, for example, add an exchange:

python rabbitmqadmin.py declare exchange --vhost=/ name=CompletedMessageExchange type=direct
Serj Sagan
  • 28,927
  • 17
  • 154
  • 183
0

If any windows user looking for powershell based solution then there is the function I have written.

Function createQueue([string]$QueueName){
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("content-type", "application/json")
$headers.Add("Authorization", "Basic Z3Vlc3Q6Z3Vlc3Q=")

$body = "{
`n  `"vhost`": `"/`",
`n  `"name`": `"$QueueName`",
`n  `"durable`": `"true`",
`n  `"arguments`": {}
`n}"

# Write-Host $body

$url='http://localhost:15672/api/queues/%2f/'+$QueueName

# Write-Host  $url

$response = Invoke-RestMethod $url -Method 'PUT' -Headers $headers -Body $body
$response | ConvertTo-Json
}

Save this into helper.ps1 file and include it into your script like this

$queueNames = 'my-queue-name'

. .\helper.ps1

createQueue($queueName)
Prakash Boda
  • 808
  • 7
  • 21
-1

Walkthrough to Create and delete a queue in RabbitMQ:

I couldn't find a commandline command to do it. Here is how I did it in code with java.

Rabbitmq-server version 3.3.5 on Ubuntu.

List the queues, no queues yet:

sudo rabbitmqctl list_queues
[sudo] password for eric:
Listing queues ...
...done.

Put this in CreateQueue.java

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import java.util.*;
public class CreateQueue {
  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("x-message-ttl", 60000);
    channel.queueDeclare("kowalski", false, false, false, args);
    channel.close();
    connection.close();
  }
}

Supply the jar file that came with your rabbitmq installation:

I'm using rabbitmq-client.jar version 0.9.1, use the one that comes with your version of rabbitmq.

Compile and run:

javac -cp .:rabbitmq-client.jar CreateQueue.java
java -cp .:rabbitmq-client.jar CreateQueue

It should finish without errors, check your queues now:

sudo rabbitmqctl list_queues
Listing queues ...
kowalski        0
...done.

the kowalski queue exists.

Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335
-2

helps to bind the exchange while you're at it:

channel.queue_bind(queueName, exchange)

C-;

Phlip
  • 5,253
  • 5
  • 32
  • 48