Изменить сообщение, отправленное 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 ответ:
Как указывает этот ответ, RabbitMQ не позволяет изменять сообщения после их публикации. Когда вы возвращаете false, RabbitMQ просто помещает исходное сообщение обратно в очередь для обработки.
Можно получить тот же эффект, повторно опубликовав сообщение с необходимыми изменениями, а затем потребив исходное сообщение, вернув true. Возможно, вы захотите повторно опубликовать сообщение, используя стандартный (безымянный) обмен , чтобы отправить его непосредственно в очередь, из которой вы получили исходное сообщение.