[ 
https://issues.apache.org/jira/browse/CAMEL-7031?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Willem Jiang reassigned CAMEL-7031:
-----------------------------------

    Assignee: Willem Jiang

> RabbitMQ Producer not able to use the default exchange
> ------------------------------------------------------
>
>                 Key: CAMEL-7031
>                 URL: https://issues.apache.org/jira/browse/CAMEL-7031
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-rabbitmq
>    Affects Versions: 2.12.2
>            Reporter: Jason Foster
>            Assignee: Willem Jiang
>
> In RabbitMQ, the default exchange is a direct exchange with no name (empty 
> string) and is pre-declared by the broker. It has one special property that 
> makes it very useful for simple applications: every queue that is created is 
> automatically bound to it with a routing key which is the same as the queue 
> name.  This is especially useful in RPC style messaging when the producer 
> specifies a REPLY_TO queue name that was created "exclusive"  Since RabbitMQ 
> binds that queue onto the default exchange, it makes RPC much simpler.
> However, the camel rabbitmq producer throws an IllegalArgumentException if 
> the exchange name is empty, which prevents this simple RPC exchange.  The fix 
> for this is simple, just don't throw that IllegalArgumentException if the 
> exchange name was set to empty string.
> The same problem may exists with the Consumer as well.
> This python script will send an rpc request (from RabbitMQ in Action)
> import time, json, pika
> creds_broker = pika.PlainCredentials("guest", "guest")
> conn_params = pika.ConnectionParameters("localhost",
>                                          virtual_host = "/",
>                                          credentials = creds_broker)
> conn_broker = pika.BlockingConnection(conn_params)
> channel = conn_broker.channel()
> msg = json.dumps({"client_name": "RPC Client 1.0",
>                   "time" : time.time()})
> result = channel.queue_declare(exclusive=True, auto_delete=True)
> msg_props = pika.BasicProperties()
> msg_props.reply_to = result.method.queue
> msg_props.content_type = "application/json"
> msg_props.correlation_id = "1"
> msg_props.delivery_mode = 2
> channel.basic_publish(body=msg,
>                       exchange="rpc",
>                       properties=msg_props,
>                       routing_key="ping")
> print "Sent 'Ping' RPC call.  Waiting for reply..."
> def reply_callback(channel, method, header, body):
>      """Receives RPC server replies."""
>      print "RPC Reply --- " + body
>      channel.stop_consuming()
> channel.basic_consume(reply_callback,
>                       queue=result.method.queue,
>                       consumer_tag=result.method.queue)
> channel.start_consuming()
> This route would be what I would want to do when consuming from Rabbit the 
> rpc call and sending back a response:
>         
> from("rabbitmq://192.168.213.130/rpc?queue=ping&routingKey=ping&durable=True&autoDelete=False&autoAck=False&username=guest&password=guest")
>             .log("Incoming Headers: ${headers}")
>             .setHeader("rabbitmq.ROUTING_KEY", header("rabbitmq.REPLY_TO"))
>             .removeHeader("rabbitmq.REPLY_TO")
>             .removeHeader("rabbitmq.EXCHANGE_NAME")
>             .setBody(simple("Pong!"))
>             .to("rabbitmq://192.168.213.130/?username=guest&password=guest");
> If I remove the illegalargumentexception, the code works as expected.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to