symfony 5 - 禁用订阅器

问题描述 投票:0回答:1

我在symfony 5项目中使用bugnag来跟踪异常情况。我也使用symfony messenger和rabbit来进行大量的处理。

一切都很好,除了在某些情况下,在Messenger中间件(RejectRedeliveredMessageMiddleware)中,在某些特定的情况下会抛出一个异常,以触发一个消息请求,同时避免一个可能的无限循环(RejectRedeliveredMessageException)。

异常应该是存在的,而且行为是正确的。例如如果一个进程意外停止了(硬重启或被杀),消息就会被requed。这个逻辑工作得很好,自动恢复工作得很完美。

唯一的问题是,buggsnag将自己注册为所有内核事件的订阅者,无论是否被处理(代码如下)。

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

];

通常情况下,异常情况会在到达一般事件调度器之前被我们的应用捕获,所以如果它们不应该被报告,就不会被报告。但是,因为那是在中间件中,一个事件被上升,即使已经被自动重试机制处理,它也会被报告,正因为如此,它产生了很多噪音和假阳性。

我需要做的是取消订阅一个特定的事件,但由于我不能接触第三方代码(buggsnag和Messenger),我找不到方法来做。

有什么方法可以从订阅者中删除一个事件?

symfony messenger bugsnag
1个回答
1
投票

注入 EventDispatcherInterface 并使用 removeSubscriber() 方法。你可以在你的自定义中间件中做这个 https:/symfony.comdoccurrentmessenger.html#middleware。


0
投票

很难说这是否可行,但这是一个角度--当你检测到你的Event被正确处理时,你可以调用 $event->stopPropagation(),也许是你自己的监听器,它应该:"......告诉调度员停止向未来的监听器传播所有事件(即不通知更多的监听器) "... ...告诉调度员停止向未来的监听者传播该事件(即不再通知任何监听者)"

https:/symfony.comdoccurrentcomponentsevent_dispatcher.html#stopping-event-flow-propagation。

© www.soinside.com 2019 - 2024. All rights reserved.