Чтобы добавить метаданные к своим сообщениям, вы можете использовать штампы .
, которые впоследствии вы сможете использовать в своем собственном пользовательском промежуточном программном обеспечении.
Например, для этого пользовательского StampInterface
реализующий класс:
class LoopCount implements StampInterface {
private int $count;
public function __construct($count) {
$this->count = $count;
}
public function getCount(): int {
return $this->count;
}
}
Затем создайте ваше собственное промежуточное программное обеспечение , которое проверяет этот штамп и повторно отправляет после обработки:
class ResendingMiddleware implements MiddlewareInterface
{
private $bus;
public function __construct(MessageBusInterface $bus) {
$this->bus = $bus;
}
public function handle(Envelope $envelope, StackInterface $stack): Envelope
{
$envelope = $stack->next()->handle($envelope, $stack);
if (null !== $stamp = $envelope->last(LoopCount::class)) {
$count = $stamp->getCount();
} else {
return $envelope;
}
// Stop dispatching
if ($count > 9) {
return $envelope;
}
$this->bus->dispatch(new RetryTest("Dit is een test"), [
new DelayStamp(5000),
new LoopCount($count + 1)
]);
return $envelope;
}
Если оно было обработано больше чем в 9 раз, принять сообщение, ничего не делая.
Вам также необходимо добавить промежуточное программное обеспечение в конфигурацию:
framework:
messenger:
buses:
messenger.bus.default:
middleware:
# service ids that implement Symfony\Component\Messenger\Middleware\MiddlewareInterface
- 'App\Middleware\ResendingMiddleware'
Я написал это в спешке и не могу проверить это правильно сейчас, но база должна помочь вам go в правильном направлении. Протестируйте и отладьте, и вы заработаете. Я вернусь к этому позже, чтобы попытаться выяснить, не пропало ли что-нибудь