为了账号安全,请及时绑定邮箱和手机立即绑定

Symfony:通过电子邮件发送失败的消息

Symfony:通过电子邮件发送失败的消息

PHP
繁星淼淼 2023-04-21 15:03:09
我有一个简单的信使配置:framework:    messenger:        failure_transport: failed        transports:            async:                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'                retry_strategy:                    max_retries: 2                    delay: 10000            failed: 'doctrine://default?queue_name=failed'        routing:            someInterface: async我想知道路由到失败的传输 fe 系统的每条消息都应该在消息重定向时向我发送电子邮件通知。我唯一的想法是定期检查messenger_messages包含存储在失败传输中的消息的表,但我认为这不是 symfony 方式的解决方案。你知道这个功能更聪明的解决方案吗?我正在使用版本 5.* 的 symfony/messenger
查看完整描述

2 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

最终,我应用了以下解决方案:


<?php

/**

 * Author: writ3it

 */


namespace App\Maintenance\Messenger;



use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;

use Symfony\Component\Messenger\MessageBusInterface;


class FailedMessageListener implements EventSubscriberInterface

{


    /**

     * @var MessageBusInterface

     */

    private MessageBusInterface $bus;


    public function __construct(MessageBusInterface $bus)

    {

        $this->bus = $bus;

    }


    public function onMessageFailed(WorkerMessageFailedEvent $event)

    {

        if ($event->willRetry()) {

            return;

        }

        $envelope = $event->getEnvelope();

        $message = $envelope->getMessage();


        $subject = sprintf("Message added to failed transport. Message: %s", \get_class($message));

        $content = serialize($message);


        $notification = new FailedMessageNotificationEvent();

        $notification->setSubject($subject)

            ->setContent($content);

        $this->bus->dispatch($notification);

    }


    /**

     * @return array

     */

    public static function getSubscribedEvents()

    {

        return [

            WorkerMessageFailedEvent::class => ['onMessageFailed', -256],

        ];

    }

}

FailedMessageNotificationEvent是一条将被我的邮件处理程序捕获的消息。该类FailedMessageListener应标记为kernel.event_subscriber或自动配置。


我没有使用中间件,因为 Messenger 直接将消息发送到失败的传输,没有中间件。


查看完整回答
反对 回复 2023-04-21
?
守着一只汪

TA贡献1872条经验 获得超3个赞

我认为不可能通过配置来完成,但您可以创建自定义中间件并自行发送电子邮件。


查看完整回答
反对 回复 2023-04-21
  • 2 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信