1

情况就是这样。

我正在使用 PHP PECL AMQP RabbitMQ 客户端。当我第一次尝试发送消息进行交换时,没有任何反应。似乎消息尚未发送,并且 AMQPQueue::get 没有返回任何内容,即使 AMQPExchange::publish 返回 true。

之后(即在第二次交换声明之后)一切正常。

会是什么?

UPD。代码示例。

<?php
$connection = new AMQPConnection;
//config...
$connection->connect();

$channel = new AMQPChannel($connection);

$exchange = new AMQPExchange($channel);
$exchange->setName('test_exchange');
$exchange->setType(AMQP_EX_TYPE_DIRECT);
$exchange->declareExchange();
$exchange->setFlags(AMQP_DURABLE);

$exchange->bind('test_exchange', 'test_routing_key');
$exchange->publish('test_message', 'test_routing_key');

$queue = new AMQPQueue($channel);
$queue->setName('test_routing_key');
$queue->declareQueue();
$queue->bind('test_exchange', 'test_routing_key');
var_dump($queue->get(AMQP_AUTOACK));
4

1 回答 1

2

发布和路由之间存在区别:发布意味着将消息发送交换器,而路由意味着将消息交换器发送到绑定实体(例如队列或另一个交换器)。

您的第一条消息已发布,但未路由,因为当时没有队列绑定到具有匹配路由键的交换。AMQPExchange::publish 返回 true 只是确认交换收到了消息。

请参阅从RabbitMQ - AMQP 0-9-1 模型解释部分拍摄的这张图片。

如果您明确需要知道消息是否路由到至少一个队列,您可以设置强制标志:(RabbitMQ - 可靠性指南

如果消息可能以更复杂的方式路由,但生产者仍然需要知道它们是否到达了至少一个队列,它可以在 basic.publish 上设置强制标志,确保 basic.return(包含回复代码和一些文本解释)如果没有适当地绑定队列,将被发送回客户端。

于 2013-09-25T22:38:44.773 回答