【问题标题】:How to retrieve the same message twice or more in RabbitMQ with php如何使用 php 在 RabbitMQ 中检索相同的消息两次或更多次
【发布时间】:2016-04-29 19:10:21
【问题描述】:

我在使用 php + RabbitMQ + MySQL 时遇到了一些问题。

我有 php 的工作人员,更新数据库中的一条记录。现在我试图纠正 如果服务器 MySQL 消失了就可以工作。

我在做什么: 我正在尝试重新连接到 DB 10 次,如果我不能 - 需要将此按摩返回给 RabbitMQ。

对于接受消息我使用 basic_ack,对于拒绝我使用 basic_nack


示例:

    if ($can_accept_message) {
        $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);

    } else {
        $message->delivery_info['channel']->basic_nack($message->delivery_info['delivery_tag']);
    }

但是 basic_nack 从队列中删除了这条消息,我不能再重复它;(

尝试这样: https://github.com/php-amqplib/php-amqplib/blob/d2b8a292f709b79b1615bef87b1b89bde4c7c347/demo/basic_nack.php

阅读: https://github.com/php-amqplib/php-amqplib/issues/221

但还是不行。

怎么了?或许您还有其他想法?

【问题讨论】:

  • 你能告诉我们你的队列配置吗?和其他虚拟问题,你确定你输入了else
  • >> 你能告诉我们你的队列的配置吗? 像这样尝试:github.com/php-amqplib/php-amqplib/blob/… >> 还有其他愚蠢的问题,你确定你输入其他的? 是的

标签: php mysql rabbitmq


【解决方案1】:

似乎函数 basic_nack 定义如下:

/**
 * Rejects one or several received messages
 *
 * @param string $delivery_tag
 * @param bool $multiple
 * @param bool $requeue
 */
public function basic_nack($delivery_tag, $multiple = false, $requeue = false)

可以看到,第三个参数是$requeue = false

你应该试试

else {
    $message->delivery_info['channel']->basic_nack($message->delivery_info['delivery_tag'], false, true);
}

【讨论】:

  • 我试着像你说的那样写,但它没有帮助=(也许我需要添加其他东西?
  • 您是逐条处理消息还是批量处理?如果批量处理,第二个参数也应该是true。所以可以肯定的是,您的消息在basic_nack(...) 之后从队列中删除,对吗?
  • 我不明白这一点,是的,我确定。
  • 你可以试试basic_reject($message->delivery_info['delivery_tag'], true),而不是basic_nack()。除了reject 不能管理批处理消息之外,它的目的完全相同。 basic_nack 应该可以工作,所以我怀疑第二个可以,但让我们试试。
  • 我不知道为什么在我尝试的时候它没有帮助,但我再次尝试并成功了!非常感谢!
猜你喜欢
  • 2015-07-04
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2017-11-10
  • 2016-05-04
相关资源
最近更新 更多