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)
| 归档时间: |
|
| 查看次数: |
1805 次 |
| 最近记录: |