symfony 5 - отключить абонента - PullRequest
0 голосов
/ 28 мая 2020

Я использую bugsnag в проекте symfony 5, чтобы отслеживать исключения. Я также использую symfony мессенджер с кроликом для тяжелой обработки.

В целом все работает нормально, за исключением того факта, что в некоторых случаях внутри промежуточного программного обеспечения мессенджера (RejectRedeliveredMessageMiddleware) в некоторых конкретных случаях выдается исключение, чтобы инициировать запрос сообщения, избегая при этом возможного бесконечного l oop (RejectRedeliveredMessageException).

Исключение должно быть, и поведение правильное. Например, если процесс неожиданно остановился (жесткая перезагрузка или уничтожение), требуется сообщение. Logi c работает хорошо, автовосстановление работает отлично.

Единственная проблема в том, что bugsnag регистрирует себя как подписчик на все события ядра, обработанные или нет (код ниже)

$listeners = [
    KernelEvents::REQUEST => ['onKernelRequest', 256],
    KernelEvents::EXCEPTION => ['onKernelException', 128],

];

Обычно исключения перехватываются в нашем приложении до того, как они попадают в общий диспетчер событий, и поэтому они не сообщаются, если не должны. Но поскольку это находится в промежуточном программном обеспечении, и событие возникает, о нем сообщается, даже если оно уже обработано механизмом автозапуска, и из-за этого он генерирует много шума и ложных срабатываний.

нужно отказаться от подписки на конкретное событие, но, поскольку я не могу коснуться стороннего кода (bugsnag и messenger), я не могу найти способ сделать это.

Есть ли способ программно удалить событие от абонента?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Введите EventDispatcherInterface и используйте метод removeSubscriber(). Вы можете сделать это в собственном промежуточном программном обеспечении https://symfony.com/doc/current/messenger.html#middleware

0 голосов
/ 28 мая 2020

Трудно сказать, сработает ли это, но это угол - когда вы обнаруживаете, что ваше событие обрабатывается должным образом, вы можете вызвать $event->stopPropagation(), возможно, от вашего собственного слушателя, который должен: "... сообщить диспетчеру, чтобы остановить любое распространение события среди будущих слушателей (т.е. чтобы больше не уведомлять слушателей) "

https://symfony.com/doc/current/components/event_dispatcher.html#stopping -event-flow-distribution

...