symfony - symfony messenger 多总线
问题描述
我需要在 Symfony 上编写的应用程序中有多个总线。为此,我正在使用信使包。
所以我需要:
- external_events_bus - 从外部系统接收消息,使用 sqs 传输
- application_events_bus - 用于应用程序事件(目前使用数据库驱动程序)
- domain_events_bus - 用于域事件(目前使用数据库驱动程序)
- command_bus - 用于命令和查询 (CQRS)(当前同步)
所以在我的messenger.yaml
我有:
framework:
messenger:
default_bus: command.bus
buses:
command.bus: ~
domain_event.bus: ~
application_event.bus: ~
external_event.bus: ~
transports:
command_bus: '%env(COMMAND_BUS_DSN)%'
internal_event_bus: '%env(INTERNAL_EVENT_BUS_DSN)%'
external_event_bus: '%(EXTERNAL_EVENT_BUS_DSN)%'
routing:
'App\Application\CommandBus\Command': command_bus
'App\Domain\EventBus\DomainEvent': internal_event_bus
'App\Application\EventBus\ApplicationEvent': internal_event_bus
'App\Infrastructure\ExternalEventBus\ExternalEvent': external_event_bus
在我的services.yaml
services:
_defaults:
autowire: true
autoconfigure: true subscribers, etc.
public: false
_instanceof:
# use tags to avoid coupling handler classes to Messenger's interface
App\Application\CommandBus\CommandHandler:
tags: [ { name: messenger.message_handler, bus: command.bus } ]
App\Interfaces\ExternalEventBus\ExternalEventHandler:
tags: [ { name: messenger.message_handler, bus: external_event.bus } ]
App\Domain\EventBus\DomainEventHandler:
tags: [ { name: messenger.message_handler, bus: domain_event.bus } ]
App\Application\EventBus\ApplicationEventHandler:
tags: [ { name: messenger.message_handler, bus: application_event.bus } ]
... // some other services here
App\Application\CommandBus\CommandBus:
class: App\Infrastructure\CommandBus\CommandBus
arguments: [ "@command.bus" ]
App\Domain\EventBus\DomainEventBus:
class: App\Infrastructure\DomainEventBus\DomainEventBus
arguments: [ "@domain_event.bus" ]
App\Application\EventBus\ApplicationEventBus:
class: App\Infrastructure\ApplicationEventBus\ApplicationEventBus
arguments: [ "@application_event.bus" ]
App\Infrastructure\ExternalEventBus\ExternalEventBus:
class: App\Infrastructure\ExternalEventBus\ExternalEventBus
arguments: [ "@external_event.bus" ]
在我只有命令总线和外部总线之前想要澄清一切都很好,但是在我添加域和应用程序总线之后,somethinkg 出错了。
在我使用ExternalEventBus
的测试中,测试外部事件是否正确处理,如下所示:
$this->eventBus = self::$container->get(PlatformEventBus::class);
$this->eventBus->dispatch(new SomeExternalEvent());
我收到类似的错误
Symfony\Component\Messenger\Exception\NoHandlerForMessageException: No handler for message "SomeExternalEvent".
但是当我bin/console debug:messenger
同时为开发和测试环境运行时,我可以看到所有事件及其处理程序之间的正确映射。
但是当我调试它可以看到HandlersLocator::getHandlers()
出于SomeExternalEvent
某种原因返回与命令总线而不是外部事件总线相关的处理程序列表(可能是因为命令总线设置为默认总线)
我知道解释和展示主题有点困难,但我已经花了一整天的时间来寻找它的问题所在。任何帮助表示赞赏,谢谢!!!
抱歉有任何错别字,我在这个例子中更改了类的名称,可能有一些错别字
解决方案
好的,我想通了,注入时使用 autowiryng 的信使MessageBusInterface
取决于变量名称,因此对于外部事件总线,它应该$externalEventBus
与其他总线相同。但我以前不明白它是如何工作的,正如我提到的,我有一段时间的命令和外部总线,只有当我添加更多总线时它才会停止工作......
推荐阅读
- list - Haskell:函数原型的问题,用于在列表中查找元素的位置
- flutter - 如何使用flutter agora插件截屏?
- r - 防止数据表列宽改变大小闪亮
- javascript - Google Docs 如何在 Google 文档中添加气泡卡/链接预览/展开外部资源?
- javascript - 为什么我不能在 Javascript 中访问此对象的元素?
- javascript - 如何编辑现有链接的元素并打开链接的编辑版本?(不保存在本地)
- java - 在孩子的父母第一个自定义键盘上调用 removeView()
- javascript - JavaScript - 无法取消选择按钮而不导致页面重新加载
- pytorch - 以任何角度翻转?
- c# - 在 xamarin 表单中出现 Plugin.Connectivity.ConnectivityChangeBroadcastReceiver 错误?