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

wri*_*3it 6 php message-queue symfony symfony5

我有一个简单的消息配置:

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
Run Code Online (Sandbox Code Playgroud)

我想知道路由到失败传输的每条消息,当消息重定向时,系统应该向我发送电子邮件通知。我唯一的想法是定期检查messenger_messages包含存储在失败传输中的消息的表,但我认为这不是 symfony 方式的解决方案。您知道针对此功能的更聪明的解决方案吗?

我正在使用 symfony/messenger 版本 5.*

wri*_*3it 10

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

<?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],
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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