werkspot/message-bus

该软件包已被放弃,不再维护。没有推荐替代软件包。

一个通用的消息总线,可用于实现 CommandBus 或 EventBus 或其他类似结构。

dev-master / 1.0.x-dev 2017-10-11 08:22 UTC

This package is auto-updated.

Last update: 2020-10-21 07:22:34 UTC


README

Author Software License Latest Version Total Downloads

Build Status Coverage Status Quality Score

本项目是什么

一个库,能够通过某些其他队列库同步或异步地发送消息到目的地。

要发送的消息可以是任何内容,目的地可以由任何字符串指定。

可以配置一个中间件链(DeliveryChain),消息将通过所有这些中间件,使我们能够在发送消息之前和/或之后执行各种操作,如验证消息、开始和提交事务、根据某些标准替换目的地、执行某些日志记录,或我们需要的任何操作。

为什么这个项目存在

消息总线可以使项目非常灵活和高效。我们可以在消息总线之上轻松创建 Command Bus、Event Bus、Event Sourcing、队列或任何类似的结构。

用法

MessageDispatcher 是消息总线的入口点。该库已经提供了一些中间件,您可以在 src/Bus/DeliveryChain 中找到。

    $bus = Bus::fromMiddlewareList($middleware1, $middleware2 /*,  ... */);
    
    $messageDispatcher = new MessageDispatcher($bus);
    
    $messageDispatcher->dispatchSynchronousMessage(
        $someObjectOrStringOrWhatever,      // some payload to deliver, persisted by the MessageRepository
        '{"deliver_to": "SomeServiceId"}',  // destination to be decoded by the delivery service (MessageDeliveryServiceInterface)
        []                                  // some whatever metadata
    );

如果您需要异步发送消息,则需要将 AsynchronousDeliveryMiddleware 添加到总线中。

AsynchronousDeliveryMiddleware 依赖于 MessageQueueServiceInterface。因此,您需要选择一个队列库并创建该库的适配器,该适配器实现了 MessageQueueServiceInterface,以便它可以注入到 AsynchronousDeliveryMiddleware 中。

例如

    $messageQueueService = new MessageQueueServiceAdapterThatImplementsMessageQueueServiceInterface(/* ... */);
    
    $bus = Bus::fromMiddlewareList(
        $middleware1, 
        $middleware2, 
        new AsynchronousDeliveryMiddleware($messageQueueService) 
        /*,  ... */
    );
    
    // Now you can send an Asynchronous (potentially Queued) message
    $messageDispatcher->dispatchQueuedMessage(
        $someObjectOrStringOrWhatever,       // some payload to deliver, persisted by the MessageRepository
        '{"deliver_to": "SomeServiceId"}',   // destination to be decoded by the delivery service (MessageDeliveryServiceInterface)
        [],                                  // some whatever metadata
        new DateTimeImmutable('2037-10-08'), // some (optional, future) delivery date
        new Priority(Priority::NORMAL)       // some priority, from 1 to 9
    );

如果您想同时发送同步和异步消息,需要注意的一点是,您需要确保在总线中先调用 AsynchronousDeliveryMiddleware,然后再调用 SynchronousDeliveryMiddleware。否则,同步中间件将始终在消息排队之前处理它,排队将无法正常工作。

安装

要安装该库,运行以下命令并将获得最新版本

composer require werkspot/message-bus

测试

要执行测试,请运行

make test

覆盖率

要生成测试覆盖率,请运行

make test-with-coverage

代码规范

要修复代码规范,请运行

make cs-fix