0

如果使用消息失败,默认情况下会延迟重新排队消息。有没有办法给消息添加一个计数器,这样我就可以知道消息是否是最后一次尝试?

这是期望的行为:

第一次尝试:

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,
  ]
}
4

1 回答 1

3

解决方案

信使.yaml:

...
buses:
            messenger.bus.default:
                middleware:
    # service ids that implement Symfony\Component\Messenger\Middleware
                    - '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;
        }
    }
}

应用\消息:

namespace App\Message;


class  Message
{
    public $body;

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

    public function setBody(array $body): void
    {
        $this->body = $body;
    }
}
于 2019-11-20T07:25:13.937 回答