在 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 工作人员在主管下运行时不会停止

如何在 Symfony Messenger 的中间件上禁用日志“信息”?

在 Symfony Messenger 异步消息处理程序上使用选民/权限的最佳方式? [关闭]