Symfony Messenger 在处理程序中获取重试计数

Jig*_*oli 9 php symfony symfony-messenger

我已经实现了 symfony Messenger https://symfony.com/doc/current/messenger.html。我想在handler实现的类中获取重试计数MessageHandlerInterface

Messenger 消费者命令抛出错误并根据配置重试 5 次。所以我想在处理程序中获取重试计数,以便我可以相应地添加一些逻辑。

我还尝试创建此答案中提到的中间件/sf/answers/4275511761/。但是这个中间件没有被执行。

小智 2

但是这个中间件没有被执行,它可能没有被配置,比如:

#messenger.yaml
framework:
    messenger:
        buses:
            messenger.bus.default:
                middleware:
                    - 'App\Middleware\RetryCountMiddleware'
Run Code Online (Sandbox Code Playgroud)

此外,Symfony 6.2 中还出现了一个新的戳记 HandlerArgumentsStamp ,它允许您更轻松地添加自己的数据。

例如:

namespace App\Middleware;

use App\Contracts\RetryCountSupportInterface;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
use Symfony\Component\Messenger\Middleware\StackInterface;
use Symfony\Component\Messenger\Stamp\HandlerArgumentsStamp;
use Symfony\Component\Messenger\Stamp\RedeliveryStamp;

class RetryCountMiddleware implements MiddlewareInterface
{
    public function handle(Envelope $envelope, StackInterface $stack): Envelope
    {
        # Check based on interface, class, stamp or something else
        if ($envelope->getMessage() instanceof RetryCountSupportInterface) {
            $envelope = $envelope->with(new HandlerArgumentsStamp([
                'retryCount' => RedeliveryStamp::getRetryCountFromEnvelope($envelope)
            ]));
        }

        return $stack->next()->handle($envelope, $stack);
    }
}
Run Code Online (Sandbox Code Playgroud)

并在手柄中

#[AsMessageHandler]
class YourMessageHandler
{

    public function __invoke(YourMessage $message, int $retryCount): void
    {
        #...
    }
}
Run Code Online (Sandbox Code Playgroud)