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 で例外がスローされた場合、3 に変更し、を 1stepNumber増やし、最後にを返して を再キューイングします。errorCount$msg$msgfalse

これには次の利点があります。

  • コンシューマがメッセージを再度処理するとき、電子メールを再度送信することはありません。
  • のとき、私はメッセージをerrorCount > 5破棄します..return false

これは素晴らしいことですが、:

$msgRabbitMQ によって再キューイングされる前に変更する方法はありますか?

4

1 に答える 1

5

この回答が指摘しているように、RabbitMQでは、メッセージを公開した後にメッセージを変更することはできませんfalseを返すと、RabbitMQは元のメッセージを処理のためにキューに戻すだけです。

必要な変更を加えてメッセージを再公開し、trueを返すことで元のメッセージを消費することで、同じ効果を得ることができます。元のメッセージを取得したキューに直接送信できるように、デフォルトの(名前のない)交換を使用してメッセージを再公開することをお勧めします。

于 2013-02-20T14:47:37.090 に答える