5

注意: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,在errorCount中加1 $msg,最后$msg通过return重新入队false

这具有以下优点:

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

这会很棒,但是:

有没有办法在$msgRabbitMQ 重新排队之前修改它?

4

1 回答 1

5

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

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

于 2013-02-20T14:47:37.090 回答