Symfony MessageHandler подсчитывает, сколько раз было отправлено сообщение - PullRequest
1 голос
/ 07 апреля 2020

Я использую Symfony Messenger, и я хочу продолжать отправлять сообщение в обработчике, пока оно не будет отправлено несколько раз.

Как я могу отслеживать это?

На данный момент это код моего класса обработчика:

class RetryTestHandler implements MessageHandlerInterface
{
    /**
    * @var EntityManagerInterface
    */
    private $entityManager;
    /**
     * @var MessageBusInterface
     */
    private $bus;

    public function __construct(MessageBusInterface $bus, EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
        $this->bus = $bus;
    }

    public function __invoke(RetryTest $message)
    {
        // TODO: Keep dispatching message until it has been dispatched 10 times?
        $this->bus->dispatch(new RetryTest("This is a test!"), [
            new DelayStamp(5000)
        ]);
    }
}

1 Ответ

2 голосов
/ 07 апреля 2020

Чтобы добавить метаданные к своим сообщениям, вы можете использовать штампы .

, которые впоследствии вы сможете использовать в своем собственном пользовательском промежуточном программном обеспечении.

Например, для этого пользовательского 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 в правильном направлении. Протестируйте и отладьте, и вы заработаете. Я вернусь к этому позже, чтобы попытаться выяснить, не пропало ли что-нибудь

...