Изменить сообщение, отправленное rabbitMQ внутри потребителя


Примечание: используя 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 на 1 в $msg и, наконец, запросить $msg на возвращение false.

Это имеет следующие преимущества:

  • когда потребитель снова обработает сообщение, он больше не будет отправлять электронное письмо.
  • Когда errorCount > 5, я просто отбрасываю сообщение.. return false.

Это было бы здорово, но:

Есть ли способ изменить $msg до того, как он будет запрошен RabbitMQ?

1 3

1 ответ:

Как указывает этот ответ, RabbitMQ не позволяет изменять сообщения после их публикации. Когда вы возвращаете false, RabbitMQ просто помещает исходное сообщение обратно в очередь для обработки.

Можно получить тот же эффект, повторно опубликовав сообщение с необходимыми изменениями, а затем потребив исходное сообщение, вернув true. Возможно, вы захотите повторно опубликовать сообщение, используя стандартный (безымянный) обмен , чтобы отправить его непосредственно в очередь, из которой вы получили исходное сообщение.