修改RabbitMQ在消费者中发送的消息

时间:2013-02-20 07:20:57

标签: symfony rabbitmq message-queue amqp

注意:RabbitMq中通过RabbitMQBundle使用Symfony2

我的制作人发送了这样的信息:

$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,在errorCount中将$msg增加1,最后通过返回{$msg重新排队false {1}}。

这具有以下优点:

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

这会很棒,但是:

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

1 个答案:

答案 0 :(得分:4)

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

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