0

我在 symfony 5 项目中使用 bugsnag 来跟踪异常。我还使用 symfony messenger 和 rabbit 进行繁重的处理。

总体而言,一切正常,除了在某些情况下,在信使中间件 (RejectRedeliveredMessageMiddleware) 内部,在某些特定情况下会引发异常以触发消息请求,同时避免可能的无限循环 (RejectRedeliveredMessageException)。

异常应该存在,并且行为是正确的。例如,如果进程意外停止(硬重启或终止),则请求消息。逻辑运行良好,自动恢复完美运行。

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

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

];

通常在到达通用事件调度器之前,我们的应用程序中会捕获异常,因此如果不应该报告它们,它们不会被报告。但是,因为它在中间件中,并且一个事件被引发,即使已经被自动重试机制处理,它也会被报告,因此它会产生很多噪音和假阳性。

我需要做的是取消订阅特定事件,但由于我无法触及第 3 方代码(bugsnag 和 messenger),我无法找到解决方法。

有没有办法以编程方式从订阅者中删除事件?

4

2 回答 2

1

注入EventDispatcherInterface和使用removeSubscriber()方法。您可以在自定义中间件中执行此操作https://symfony.com/doc/current/messenger.html#middleware

于 2020-05-28T18:14:05.923 回答
0

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

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

于 2020-05-28T18:21:12.503 回答