it-bens/message-bus-redirect-bundle

允许将消息从一个消息总线重定向到另一个消息总线的包。

v0.1.0 2022-08-19 10:04 UTC

This package is auto-updated.

Last update: 2024-09-15 04:10:46 UTC


README

有些包无法处理单个应用中的多个消息总线。如果命令或查询需要传递到不同的总线,这可能会成为一个问题。这个包可以通过中间件将 Symfony 消息传递者从一个总线重定向到另一个总线。

如何安装此包?

该包可以通过 Composer 安装。

composer require it-bens/message-bus-redirect-bundle

如果你使用 Symfony Flex,该包将被自动启用。对于较老的程序,请在 Kernel 类中启用它。

重定向过程是如何工作的?

使用中间件将一个总线的信封重定向到另一个总线相当简单。它必须从当前总线捕获信封并将其分发给目标总线。目前,中间件不会将信封传递给下一个中间件。这意味着信封将不会在源总线上处理。(此行为可能改变或成为可配置的)

这个包是如何知道目标总线的?

目标总线由重定向策略确定。这些是实现了 RedirectStrategyInterface 的服务。它们接收信封并返回它应该传递到的总线名称。

目前实现了两种策略:MessageClassStrategyDecisionMakerStrategy。前者使用从包配置(稍后描述)中获得的 Message-Class-to-Bus-Name 映射来通过消息的类找到总线名称。后者更加灵活。它允许创建实现 DecisionMakerInterface 的决策者服务。这个策略将逻辑的责任交给了使用此包的人。

⚠ 可以按配置顺序使用多个策略。中间件将使用从策略返回的第一个非空总线名称。

DecisionMakerStrategy 以没有任何特定顺序的方式调用决策者。因此,如果决策者不应该负责,它们应该始终返回 null

如何配置此包?

以下配置使用 MessageClassStrategyDecisionMakerStrategy

itb_message_bus_redirect:
  redirect_strategies:
    - ITB\MessageBusRedirectBundle\RedirectStrategies\MessageClassStrategy
    - ITB\MessageBusRedirectBundle\RedirectStrategies\DecisionMakerStrategy

任何未知策略都将导致配置错误。

MessageClassStrategy 需要额外的配置才能工作

  message_classes:
    - { message_class: SomeNamespace\CreateObjectCommand, bus_name: command.bus }
    - { message_class: SomeNamespace\QueryObjectsCommand, bus_name: query.bus }

消息类必须是完全限定的类名。总线名称必须与消息传递配置中的名称匹配。

DecisionMakerStrategy 不需要额外的配置,但至少需要一个已注册的决策者。

如何启用中间件?

只有当配置了总线来这样做时,才会使用中间件

framework:
    messenger:
        default_bus: default.bus
        buses:
            default.bus:
                default_middleware: false
                middleware:
                    - ITB\MessageBusRedirectBundle\MessageRedirectMiddleware
                    - add_bus_name_stamp_middleware
                    - reject_redelivered_message_middleware
                    - dispatch_after_current_bus
                    - failed_message_processing_middleware
                    - send_message

Symfony 消息传递者不允许显式中间件顺序。一般来说,可以在任何位置使用 MessageRedirectMiddleware,并且它将运行良好(如果没有其他中间件干扰)。但是,将其放在最前面可以避免不必要的处理。如果配置的总线仅用于重定向,则 MessageRedirectMiddleware 应该是唯一的中间件。如果需要调用其他中间件,它们必须按照服务名称首先放置。(此示例使用由 Symfony 通常配置的默认中间件,但不包括 HandleMessageMiddleware

贡献

我非常高兴看到软件开发者社区像我一样热爱开源!♥

这就是为什么我欣赏每个被提出的问题(最好是建设性的),以及每个提供其他或甚至更好的代码到这个包的拉取请求。

你们都太棒了!