【问题标题】:Symfony: send failed messages via emailSymfony:通过电子邮件发送失败的消息
【发布时间】:2020-09-16 01:24:25
【问题描述】:

我有一个简单的 messanger 配置:

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

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

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

【问题讨论】:

    标签: php symfony message-queue symfony5


    【解决方案1】:

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

    <?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 直接向失败的传输发送消息,没有中间件。

    【讨论】:

    • 嘿,谢谢您的解决方案,可以指定为什么 -90 作为事件监听器的优先级吗?
    • 这个应该标记为正确答案,以后会帮助更多的人。
    • @Famas23 今天,我不知道 :) 我认为,最好的选择是 -256(或更小),因为 Symfony 在内部使用范围 +/-256,并且该订阅者应该最后执行。
    【解决方案2】:

    我认为通过配置不可能做到这一点,但是您可以自己创建自定义中间件并发送电子邮件。 https://symfony.com/doc/current/messenger.html#middleware

    您可以查看FailedMessageProcessingMiddleware 以供参考https://github.com/symfony/messenger/blob/master/Middleware/FailedMessageProcessingMiddleware.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多