5

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

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

在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客户端中,我们只需将参数“exchange”设置为“”,告诉服务器我们将通过默认交换将消息发送到与routingkey相同的指定队列。

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

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

有人能指出我正确的方向吗?我真的很感激!

4

1 回答 1

7

查看http://www.rabbitmq.com/tutorials/amqp-concepts.html并专门查找标题为Default Exchange的部分。

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

在java中你会这样做:

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

通过指定""in 表示使用默认交换。(应该没有必要使用amq.direct

根据上面的文章,它指出:

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

因此,这意味着只有在您已经创建了要发布到的队列时,才能发布到默认交换。

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

于 2012-12-05T10:23:37.877 回答