2012-11-30 27 views
4

我试图连接到centos 5.6中的rabbitmq-c,然后按照网站的步骤测试其在c客户端中的功能:http://www.rabbitmq.com/tutorials/tutorial-one-java.html。 但是,当我使用默认交换时它失败。在rabbitmq-c中使用默认交换

例如,我想通过名称为“(AMQP default)”的默认交换机将消息“Hello world”发送到名为“myqueue”的队列。

在java中,这里是代码:

channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); 

但在C,当我运行rmq_new_task.c(几乎相同amqp_sendstring.c)作为https://github.com/liuhaobupt/rabbitmq_work_queues_demo-with-rabbit-c-client-lib的例子。

queuename="myqueue"; 
...... 
die_on_error(amqp_basic_publish(conn, amqp_cstring_bytes(exchange), 
    amqp_cstring_bytes(routingkey), &props, amqp_cstring_bytes("Hello world")), 
    "Publishing"); 

在Java客户端,我们刚刚设置的参数“交换”到“”告诉我们会发送消息到名为一样通过默认交换routingkey指定队列服务器。

那么我应该给c客户机中的第二个参数“交换”(使用默认交换)有什么价值?我试图将其设置为“”或“amq.direct”。它在运行时没有显示任何错误,并且看起来运行良好。

但是,当我检查rabbitmq-management(http:// localhost:55672 /#/队列)时,名为“myqueue”的队列不存在!

有人请指点我正确的方向?我真的很感激!

+0

你真的创建了队列吗?因为只是发布到默认的交易所不会为你创建... – kzhen

+0

感谢您的评论。但是[这里](http://www.rabbitmq。com/tutorials/tutorial-three-java.html)表示,“第一个参数是交换名称,空字符串表示默认或无名交换:消息通过routingKey指定的名称路由到队列,if它存在。“ 我误解了吗? – Hugo

回答

4

看看http://www.rabbitmq.com/tutorials/amqp-concepts.html并特别寻找标题为默认交易所的部分。

默认交换的使用非常简单。

在java中,你会怎么做:

channel.basicPublish("", "hello", null, message.getBytes()); 

通过指定""说,使用默认的交流。 (应该没有必要使用amq.direct

按照文章上面它指出:

默认交换是没有名字(空字符串)直接交流 由经纪人预先声明。它有一个特殊属性,使其对于简单应用程序非常有用:每个创建的队列都使用与 队列名称相同的路由键自动绑定到它。

因此,这意味着,如果你有已经创建要发布到队列发布到默认的交换才有效。

因此,您需要先创建队列,然后才能发布到默认交换。一旦你完成了,你将开始看到你的消息。

+0

啊,我真的很感谢你的帮助。我只是根据你的建议进行测试,并且它工作正常!而且我对使用粉丝交换的另一个困惑,也让我感到不安,它也解决了。 – Hugo