Symfony Messenger:通过电子邮件发送记录的信使错误(通过 swift_mailer)?

vir*_*ize 5 email messenger monolog symfony4

我已将 monolog 配置为通过电子邮件发送错误,如 symfony 文档中所述: https: //symfony.com/doc/4.3/logging/monolog_email.html

适用于处理请求期间发生的所有错误以及控制台命令错误。但它不会针对处理消息期间发生的错误发送电子邮件。

运行消费者时会显示错误bin/console messenger:consume async -vv,它们也会显示在 prod.log 中,如下所示: [2020-01-10 12:52:38] messenger.CRITICAL: Error thrown while handling message...

感谢您提供有关如何设置独白以通过电子邮件发送信使错误的任何提示。

fam*_*s23 1

事实上,monologswift_mailer类型使用SwiftMailerHandler 希望还实现重置接口并默认使用内存假脱机希望将所有电子邮件保留在缓冲区中直到它被破坏,所以直到请求结束:

  • 内核终止
  • onCli终止
  • 或者直到调用重置方法,这意味着对于信使工作人员来说,不会发送任何电子邮件,因为没有即时刷新 - 所有电子邮件都将保存在内存缓冲区中,如果进程被终止,则可能会丢失。

要解决此问题,您只需禁用memoryswiftmailer 的默认假脱机设置即可。WorkerMessageFailedEvent 另一个解决方案是在事件触发后刷新您的电子邮件,您可以实现一个事件订阅者来执行此操作。

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
use Symfony\Contracts\Service\ResetInterface;

/**
 * Class ServiceResetterSubscriber.
 */
class ServiceResetterSubscriber implements EventSubscriberInterface
{

     protected ResetInterface $servicesResetter;
     public function __construct(ResetInterface $servicesResetter)
     {
         $this->servicesResetter = $servicesResetter;
     }
     public function resetServices(): void
     {
         $this->servicesResetter->reset();
     }
     public static function getSubscribedEvents(): array
     {
         return [
             WorkerMessageFailedEvent::class => ['resetServices', 10],
         ];
     }

 }
Run Code Online (Sandbox Code Playgroud)

使用正确的参数注册您的服务:

App\EventSubscriber\ServiceResetterSubscriber:
    arguments: ['@services_resetter']
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果没有这个(并且没有缓冲区限制),您的应用程序将会泄漏,并且不会发送任何电子邮件。

另一个技巧: 确保您的消息实现了\JsonSerializable在日志中获取消息内容,因为信使直接使用他的独白,并且其上下文序列化器希望使用 json_encode 进行序列化。这就是为什么我们需要在使用 json_encode 进行编码时自定义它们的 JSON 表示形式。