Prooph,如何通过本地命令总线和BernardMessageProducer路由一些消息

时间:2016-08-07 15:15:27

标签: php cqrs prooph

我已经让命令总线运行了一段时间并开发了很多我的应用程序。现在他们是我希望异步处理的一些命令。我添加了BernardMessageProducer,这一切似乎都有效。我想只将窗帘命令发送到异步总线,其余部分在本地处理。

这是可能的,我该怎么做。 我已经编写了一个命令路由器,但是在命令总线处理完消息之后。

谢谢

2 个答案:

答案 0 :(得分:2)

来自readme

如果要设置一个处理所有消息异步的总线,可以通过将您选择的消息生成器初始化的Prooph \ ServiceBus \ Plugin \ MessageProducerPlugin附加到消息总线来实现。

让我们看一个使用psb-zeromq-producer

的简单示例
//app bootstrap
$container = new Container;
$container['config'] = [
    'prooph' => [
        'zeromq_producer' => [
            'dsn' => 'tcp://127.0.0.1:5555', // ZMQ Server Address.
            'persistent_id' => 'example', // ZMQ Persistent ID to keep connections alive between requests.
            'rpc' => false, // Use as Query Bus.
        ]
    ]
];

$factory = \Prooph\ServiceBus\Message\ZeroMQ\Container\ZeroMQMessageProducerFactory;
$zmqProducer = $factory($container);

$commandBus = new \Prooph\ServiceBus\CommandBus();

$messageProducerForwarder = new \Prooph\ServiceBus\Plugin\MessageProducerPlugin($zmqProducer);

$commandBus->utilize($messageProducerForwarder);

$echoText = new ExampleCommand('It works');
$commandBus->dispatch($echoText);

您还可以使用消息路由器插件将单个消息路由到消息生产者。

注意:如果要处理特定命名空间异步的所有消息,Prooph \ ServiceBus \ Plugin \ Router \ RegexRouter是一个不错的选择。

答案 1 :(得分:0)

我不确定如何使用prooph(特别是因为你没有提供任何代码样本),但一般来说:有可能在Mathias Noback中找到一个好的方法'在GetPreferredSize的文档中的MessageBus-repository。

您可以创建一个检查中间件,例如对于标记界面(如上面链接的示例中所示):

public function handle($message, callable $next)
{
    if ($message instanceof IsHandledAsynchronously) {
        // handle the message asynchronously using a message queue
        $this->messageQueue->add($message);
    } else {
        // handle the message synchronously, i.e. right-away
        $next($message);
    }
}

然后,只需要通过让它实现正确的接口来标记您的命令,并显然将中间件附加到命令总线中的正确位置。

如果你有问题建议你有多个命令总线。然后你可能想要某种与命令匹配的CommandResolver,例如:通过它的类名到相应的命令总线。再次参阅Mathias Noback的文档,尤其是同一文档中的Command Bus部分和Defining the command handler map