【问题标题】:RabbitMQ take one message from queue on launchRabbitMQ 在启动时从队列中获取一条消息
【发布时间】:2017-06-09 15:10:44
【问题描述】:

当工作人员关闭时,我将许多消息发布到 RabbitMQ 中的队列。 然后我启动我的工作人员,他从队列中获取所有消息并且他工作正常但是当我在他结束之前停止我的工作进程时,所有消息都从队列中删除。 如果我开始第二个同一个工人,他没有消息要接受。

$channel->queue_declare($action, false, false, false, false);

$channel->basic_qos(null, 1, null);
$channel->basic_consume($action, '', false, true, false, false, $callback);

我怎样才能让我的工作人员在从队列开始时只接收一条消息,而当工作人员停止和启动时,他继续从他停止的队列中接收消息?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    如果没有消息可取,则消息已被确认。

    “自动确认”应禁用,以便必须手动显式发回确认(即在所有工作完成后)以完成消息的使用。

    $no_ack = false; # If no_ack is true the server does NOT expect a
                     # basic.ack response and will dequeue the message immediately!
    $channel->basic_consume($action, '', false, $no_ack, false, false, $callback);
    

    PHP tutorial on the RabbitMQ site 显示如何从回调中发送确认。

    只要工作人员在发送确认之前被杀死,当连接关闭时消息将再次可用 - 并且可以被其他消费者拾取。见Message Acknowledgements

    具体来说,写no-ack 位:

    如果此字段设置为 (true),则服务器不期望消息确认。也就是说,当消息被传递到客户端时,服务器假定传递将成功并立即将其出列。 此功能可能会提高性能,但会以可靠性为代价。如果客户端在传递到应用程序之前死亡,消息可能会丢失。

    【讨论】:

    • 看起来不错,但我不知道现在我如何才能发回消息已完成消费的信息。
    • @BartekPieczonka 使用bacic_ack 方法(对应于basic.ack 命令)。 PHP 库文档是 .. 废话,但在不同的客户端之间是相同的原则。请参阅rabbitmq.com/tutorials/tutorial-two-php.html 并注意$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
    猜你喜欢
    • 2017-09-16
    • 2013-05-17
    • 2017-04-17
    • 1970-01-01
    • 2013-12-18
    • 2018-08-10
    • 2013-08-09
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多