Php 是否要阻止空队列上的使用者

Php 是否要阻止空队列上的使用者,php,rabbitmq,amqp,consumer,Php,Rabbitmq,Amqp,Consumer,细节 我有一个用PHP编写的consumer,它试图使用消息。我的目标很简单——如果队列中没有消息,释放执行并继续,考虑到“没有检索到数据” 当前想法 我试过了,比如: $flag = AMQP_NOWAIT; $this->queue->consume($callbackFunction, $flag, $this->consumerTag); 但它不起作用。到目前为止,我已经找到了解决方法,比如-我声明连接超时,比如说,5秒,然后通过以下方式捕获它: try {

细节

我有一个用PHP编写的consumer,它试图使用消息。我的目标很简单——如果队列中没有消息,释放执行并继续,考虑到“没有检索到数据”

当前想法

我试过了,比如:

$flag = AMQP_NOWAIT;
$this->queue->consume($callbackFunction, $flag, $this->consumerTag);
但它不起作用。到目前为止,我已经找到了解决方法,比如-我声明连接超时,比如说,5秒,然后通过以下方式捕获它:

try {
    $this->consumer->consume($this->consumer->getReadMessageCallback($notifications, $requeue));
} catch (\AMQPConnectionException $connectionException) {
    //based on timeouts. Are there other ways to interrupt empty queue consuming? AMQP_NOWAIT fails, does nothing:
    return [];
}
但是,这是一种非常“黑客”的方式。这对我有用,但是:

  • 仍在阻止代码超时秒
  • 如果我有太多的消息(即在超时结束之前无法完成),则显然会失败
  • 而且,它甚至没有文档记录,所以依赖它应该是最后的手段
接下来-我尝试创建队列时使用
AMQP_IFEMPTY | AMQP_PASSIVE
。问题是-如果队列中没有消息,它将删除队列,并且在尝试从那里获取消息时会引发异常(我可能会捕捉到)。但随后出现了一个问题,比如-队列被立即删除,我甚至无法在那里添加消息

问题

从空队列中读取消息确实是一个常见的问题,因此我确信这应该是一种解决问题的方法。因此,我将如何做到这一点


是的,手动链接是
/pl/
,因为没有“en”链接。但无论如何,它的可读性或多或少都和英语一样。

如果您需要确定队列是否为空,可以调用
AMQPQueue::declare()
,它是幂等的,结果返回队列中的消息计数。请注意,该数字并不十分准确(请参阅)

此外,您只需调用
AMQPQueue::get()
(其行为类似于在管理工具中完成的)

在这之后,正如您也尝试过的,您可以将
AMQPConnection::setReadTimeout()
设置为某个较低的值(在本地网络中,1秒可能就足够了),然后调用
AMQPQueue::consume()
,如果使用者等待时间过长,则捕获超时异常


关于糟糕的文档,请参阅此问题的答案:。

我可以问一下阻塞等待有什么问题吗?这是一个消费者…我想改变这种行为。这是API的一部分。假设我只想检索消息(并重新查询它们)——就像在admin中一样。RabbitMQ的工具。事实上,如果他们是在空队列上进行的,那么这肯定是可能的。奇怪的是,我唯一的“文档”就是我为PHPStorm安装的那些存根。所以你至少要感谢他们。根据我的模型,我认为
::get()
正是我所需要的。非常感谢。非常抱歉,我们还没有写任何文档。存根是由众多的贡献者制作的,我们试图至少让它们保持最新。现在我们所有的努力都集中在正确的AMQP协议实现和代码库一致性上,这有时有点棘手。我希望今年我们会更新文档并添加一些示例,至少我的trello中有关于它的卡片,github上也有关于它的问题。好吧,无论如何,我正在使用这些存根,它们能够指导到这一点(因此,几乎可以使用所有需要的功能的应用程序)。我还记得所有这些答案,链接在这里,因为我正在使用它们。不幸的是,我不能再感谢那些投了一两张赞成票的人了。。