Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?

Posted

技术标签:

【中文标题】Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?【英文标题】:How does Symfony Messenger determine which handler should handle each type of message? 【发布时间】:2019-12-19 20:52:44 【问题描述】:

我正在尝试使用 Messenger 组件在 rabbit 和 Symfony 中实现交换。

假设我们有交通工具:

messenger:
    transports:
        amqp_image_resize:
            dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
            options:
                exchange:
                    name: image_resize_ex
                    type: fanout
                queue:
                    name: image_resize_qu

    routing:
         'App\MessageBus\Message\Image\Resize': amqp_image_resize

消费者如何知道它应该使用哪个处理程序来处理消息?

【问题讨论】:

【参考方案1】:

首先,处理程序类应该实现Symfony\Component\Messenger\Handler\MessageHandlerInterface

这允许 Symfony 使用适当的标签自动配置服务。

然后你的处理程序应该用它能够处理的消息类型来输入提示。在你的情况下,是这样的:

namespace App\MessageBus\Handler;

use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use App\MessageBus\Message\Image\Resize;

class ResizeHandler implements MessageHandlerInterface 

   public function __invoke(Resize $message) 

      // do your thing
   


接口加上参数 type-hint 允许 Symfony 决定哪个处理程序应该处理这个消息。

这显示在文档here 上。

【讨论】:

以上是关于Symfony Messenger 如何确定应由哪个处理程序处理每种类型的消息?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony messenger 和 mailer:如何添加 binding_key?

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

如何关闭 symfony messenger 组件的日志记录

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

如何避免在 Symfony Messenger 中处理来自“子”类的消息?

在 Symfony Messenger 组件中使用独立的发件人