Symfony Messenger / RabbitMQ检测请求的消息

时间:2019-11-18 15:24:15

标签: configuration rabbitmq symfony4 middleware symfony-messenger

如果使用方消息失败,则默认情况下将延迟重新排队消息。 有没有一种方法可以在邮件中添加计数器,这样我就可以知道邮件是否正在最后一次尝试?

这是理想的行为:

第一次尝试:

App\Message\Message {
  body: array:2 [
    "id" => 2
    "alias" => "some_alias",
    "attempt" => 0,
  ]
}

第一次重试:

App\Message\Message {
  body: array:2 [
    "id" => 2
    "alias" => "some_alias",
    "attempt" => 1,
  ]
}

第二次重试:

App\Message\Message {
  body: array:2 [
    "id" => 2
    "alias" => "some_alias",
    "attempt" => 2,
  ]
}

第三次重试:

App\Message\Message {
  body: array:2 [
    "id" => 2
    "alias" => "some_alias",
    "attempt" => 3,
  ]
}

1 个答案:

答案 0 :(得分:1)

解决方案

messenger.yaml:

...
buses:
            messenger.bus.default:
                middleware:
    # service ids that implement Symfony\Component\Messenger\Middleware
                    - 'App\Middleware\RetryMiddleware'
...

App \ Middleware \ RetryMiddleware:

namespace App\MessageMiddleware;

use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Psr\Log\LoggerInterface;

class RetryMiddleware implements MiddlewareInterface
{
    public function handle(Envelope $envelope, StackInterface $stack): Envelope
    {
        try {
            return $stack->next()->handle($envelope, $stack);
        } catch (\Throwable $error) {
            $msg = $envelope->getMessage();
            $body = $msg->getBody();
            $body['attempt']++;
            $msg->setBody($body);

            //rethrow same error
            throw $error;
        }
    }
}

App \ Message:

namespace App\Message;


class  Message
{
    public $body;

    public function getBody()
    {
        return $this->body;
    }

    public function setBody(array $body): void
    {
        $this->body = $body;
    }
}