【问题标题】:Modify message sent by rabbitMQ inside consumer修改消费者内部rabbitMQ发送的消息
【发布时间】:2013-02-20 07:20:57
【问题描述】:

注意:Symfony2 中通过RabbitMQBundle 使用RabbitMq

我的制作人发送这样的消息:

$message = array(
    'class' => get_class($receiver),
    'id' => $receiver->getId(),
    'stepNumber' => 1,
    'errorCount' => 0
);

消费者从数据库中检索$receiver并向他发送电子邮件。

public function execute(AMQPMessage $msg)
{
    //Step1 - retrieve user from db

    //Step2 - send email

    //Step3 - update stuff in database
}

为了跟踪错误,我想在每个步骤中处理异常。如果在第 3 步抛出异常,我想将stepNumber 修改为 3,将$msg 中的errorCount 增加1,最后通过返回false$msg 重新排队。

这样有以下优点:

  • 当消费者再次处理消息时,它不会再次发送电子邮件。
  • errorCount > 5,我只是丢弃消息..return false

这很好,但是:

有没有办法在RabbitMQ重新排队之前修改$msg

【问题讨论】:

    标签: symfony rabbitmq message-queue amqp


    【解决方案1】:

    正如this 回答指出的那样,RabbitMQ 不允许您在发布消息后更改消息。当你返回 false 时,RabbitMQ 只是将原始消息放回队列中进行处理。

    可以通过重新发布带有您想要的更改的消息来获得相同的效果,然后通过返回 true 来使用原始消息。您可能希望使用 default (nameless) exchange 重新发布消息,以便可以将其直接发送到您从中获取原始消息的队列。

    【讨论】:

    • 您的意思是,将原始消息的克隆发送回队列而不是对其进行修改?
    最近更新 更多