在 Symfony Messenger 组件中使用独立的发件人
Posted
技术标签:
【中文标题】在 Symfony Messenger 组件中使用独立的发件人【英文标题】:Using senders independent in Symfony messenger component 【发布时间】:2020-11-11 21:46:33 【问题描述】:我正在使用 Symfony 4.2 并且有一条消息要通过 messenger 组件发送,这是一条应该通过几个渠道(例如 SMS 和电子邮件)发送的通知。我想知道如何使这些发件人独立(例如第一个通道失败并抛出异常) - 如何尝试通过第二个发件人独立发送?目前,当链中的一个发送者发生故障时,其余发送者无法尝试发送通知。
在发件人级别捕获异常似乎不是一个好的解决方案,因为返回信封会导致它将被标记为发送不正确的内容。
我已经开始为每个频道制作消息以保持 sentStamp 约定,但似乎应该是一条消息和几个频道监听一条消息(即使配置表明使用 senders
关键字):
routing:
'App\Messenger\Command\Notification\SendSomeInformation':
senders:
- App\Messenger\Sender\Notification\EmailSender
- App\Messenger\Sender\Notification\SmsSender
这类问题有什么好的方法吗?
【问题讨论】:
我不得不承认我不知道您可以为每种消息类型指定特定的发件人。在文档中也找不到它,但它看起来很整洁。我只是为此使用常规处理程序,但这种配置可能是有利的。 @yivi symfony.com/doc/4.2/messenger.html#routing 该段中的最后一个代码示例 呵呵,这些选项在较新版本的文档中不再可用,我想知道它们是否被删除了。如果您计划升级,请记住一些事情。 @yivi 好像可以symfony.com/doc/master/… 在第二个链接中,我没有看到像 4.2 版本中的示例。我错过了吗? 【参考方案1】:一种可能性是配置两个不同的传输,并将每个处理程序分配给不同的传输,因此如果其中一个失败并使消息出队,另一个仍然有机会运行。
# config/packages/messenger.yaml
transports:
async1:
# dsn
async2:
# dsn
...
routing:
'App\Messenger\Command\Notification\SendSomeInformation': [async1, async2]
将处理程序限制为传输可以通过in code or config 完成,选择更适合您的方式。
在配置中:
# config/services.yaml
App\Messenger\Sender\Notification\SmsSender:
tags:
- name: 'messenger.message_handler', from_transport: 'async1'
【讨论】:
以上是关于在 Symfony Messenger 组件中使用独立的发件人的主要内容,如果未能解决你的问题,请参考以下文章
如何关闭 symfony messenger 组件的日志记录
Symfony Messenger 4.3 - 从理论传输中消费消息失败(抛出异常)
Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?
Symfony messenger 工作人员在主管下运行时不会停止