Symfony: отправка неудачных сообщений по электронной почте - PullRequest
1 голос
/ 28 мая 2020

У меня простая конфигурация мессенджера:

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

Я хотел бы знать о каждом сообщении, перенаправленном на отказавший транспорт, т.е. система должна отправлять мне уведомление по электронной почте, когда сообщение перенаправляется. Моя единственная идея - периодически просматривать messenger_messages таблицу, которая содержит сообщения, хранящиеся в отказавшем транспорте, но imao это не решение symfony. Знаете ли вы более умное решение для этой функции?

Я использую symfony / messenger с версией 5. *

Ответы [ 2 ]

1 голос
/ 17 августа 2020

В конце концов, я применил следующее решение:

<?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', -90],
        ];
    }
}

FailedMessageNotificationEvent - это сообщение, которое будет перехвачено моим обработчиком рассылки. Класс FailedMessageListener должен быть помечен как kernel.event_subscriber или настроен автоматически.

Я не использовал промежуточное ПО, потому что мессенджер отправляет сообщения на отказавший транспорт напрямую, без промежуточного ПО.

0 голосов
/ 28 мая 2020

Я не думаю, что это возможно сделать через конфигурацию, но вы создаете свое собственное промежуточное ПО и отправляете электронное письмо самостоятельно. https://symfony.com/doc/current/messenger.html#middleware

Вы можете проверить FailedMessageProcessingMiddleware для справки https://github.com/symfony/messenger/blob/master/Middleware/FailedMessageProcessingMiddleware.php

...