Symfony:通过电子邮件发送失败的消息
Posted
技术标签:
【中文标题】Symfony:通过电子邮件发送失败的消息【英文标题】:Symfony: send failed messages via email 【发布时间】: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.*
【问题讨论】:
【参考方案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
【讨论】:
以上是关于Symfony:通过电子邮件发送失败的消息的主要内容,如果未能解决你的问题,请参考以下文章
在 Symfony Messenger 组件中使用独立的发件人
如何在 Symfony 中对 Monolog 消息进行高级过滤?
使用javascript通过google api发送邮件失败