我需要在 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
某种原因返回与命令总线而不是外部事件总线相关的处理程序列表(可能是因为命令总线设置为默认总线)
我知道解释和展示主题有点困难,但我已经花了一整天的时间来寻找它的问题所在。任何帮助表示赞赏,谢谢!!!
抱歉有任何错别字,我在这个例子中更改了类的名称,可能有一些错别字