我在 symfony 5 项目中使用 bugsnag 来跟踪异常。我还使用 symfony messenger 和 rabbit 进行繁重的处理。
总体而言,一切正常,除了在某些情况下,在信使中间件 (RejectRedeliveredMessageMiddleware) 内部,在某些特定情况下会引发异常以触发消息请求,同时避免可能的无限循环 (RejectRedeliveredMessageException)。
异常应该存在,并且行为是正确的。例如,如果进程意外停止(硬重启或终止),则请求消息。逻辑运行良好,自动恢复完美运行。
唯一的问题是 bugsnag 将自己注册为所有内核事件的订阅者,无论是否处理(下面的代码)
$listeners = [
KernelEvents::REQUEST => ['onKernelRequest', 256],
KernelEvents::EXCEPTION => ['onKernelException', 128],
];
通常在到达通用事件调度器之前,我们的应用程序中会捕获异常,因此如果不应该报告它们,它们不会被报告。但是,因为它在中间件中,并且一个事件被引发,即使已经被自动重试机制处理,它也会被报告,因此它会产生很多噪音和假阳性。
我需要做的是取消订阅特定事件,但由于我无法触及第 3 方代码(bugsnag 和 messenger),我无法找到解决方法。
有没有办法以编程方式从订阅者中删除事件?