首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >symfony信使多总线

symfony信使多总线
EN

Stack Overflow用户
提问于 2021-07-31 11:40:43
回答 1查看 1K关注 0票数 0

我需要有多个总线在我的应用程序写在Symfony上。为此,我使用信使包。

所以我需要:

  • external_events_bus -从外部系统接收消息,使用sqs transport
  • application_events_bus -用于应用程序事件(对于now)
  • domain_events_bus使用数据库驱动程序-对于域事件使用数据库驱动程序)(对于now)
  • command_bus使用数据库驱动程序)-用于命令和查询(CQRS) (当前同步)

所以在我的messenger.yaml里我有:

代码语言:javascript
复制
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

代码语言:javascript
复制
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" ]

想澄清之前我只有命令总线和外部总线,一切都很好,但是在我添加域和应用程序总线之后,有些地方出错了。

在测试中,我使用ExternalEventBus测试外部事件是否正确处理,如下所示:

代码语言:javascript
复制
    $this->eventBus = self::$container->get(PlatformEventBus::class);
    $this->eventBus->dispatch(new SomeExternalEvent());

我的错误就像

代码语言:javascript
复制
Symfony\Component\Messenger\Exception\NoHandlerForMessageException: No handler for message "SomeExternalEvent".

但是,当我为dev和test env运行bin/console debug:messenger时,我可以看到所有事件与它们的处理程序之间的正确映射。

但是,当我调试时,它可以看到,由于某种原因,该HandlersLocator::getHandlers()返回与命令总线相关的处理程序列表,而不是外部事件总线(可能是因为命令总线设置为默认总线)。

我知道这是有点难以解释和显示主题,但我已经花了一整天的时间,以找出它的问题。感谢任何帮助,谢谢!

对不起,对于任何类型的键入,本例中我更改了类的名称,并可能做了一些键入

EN

回答 1

Stack Overflow用户

发布于 2021-07-31 12:54:26

好的,我知道了,当您注入MessageBusInterface时,使用autowiryng的信使取决于变量名,所以对于外部事件总线,它应该是$externalEventBus,对于其他总线也应该是相同的。但我不明白它以前是如何工作的,正如我刚才提到的,我有一段时间的命令和外部总线,只有当我增加更多的总线时,它才停止工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68601753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档