我正在使用新的Symfony Messenger Component 4.1 和RabbitMQ 3.6.10-1 从我的 Symfony 4.1 Web 应用程序中排队和异步发送电子邮件和 SMS 通知。我的 Messenger 配置 ( messenger.yaml
) 如下所示:
framework:
messenger:
transports:
amqp: '%env(MESSENGER_TRANSPORT_DSN_NOTIFICATIONS)%'
routing:
'App\NotificationBundle\Entity\NotificationQueueEntry': amqp
当要发送新通知时,我将其排队如下:
use Symfony\Component\Messenger\MessageBusInterface;
// ...
$notificationQueueEntry = new NotificationQueueEntry();
// [Set notification details such as recipients, subject, and message]
$this->messageBus->dispatch($notificationQueueEntry);
然后我在命令行上像这样启动消费者:
$ bin/console messenger:consume-messages
我已经实现了SendNotificationHandler
实际交付发生的服务。服务配置:
App\NotificationBundle\MessageHandler\SendNotificationHandler:
arguments:
- '@App\NotificationBundle\Service\NotificationQueueService'
tags: [ messenger.message_handler ]
和班级:
class SendNotificationHandler
{
public function __invoke(NotificationQueueEntry $entry): void
{
$this->notificationQueueService->sendNotification($entry);
}
}
到此为止,一切顺利,通知已送达。
现在我的问题是:由于(临时)网络故障,电子邮件或 SMS 可能无法发送。在这种情况下,我希望我的系统在指定的时间后重试交付,最多达到指定的最大重试次数。实现这一目标的方法是什么?
我已经阅读了关于Dead Letter Exchanges的文章,但是,我找不到任何关于如何将其与 Symfony Messenger 组件集成的文档或示例。