我已经让命令总线运行了一段时间并开发了很多我的应用程序。现在他们是我希望异步处理的一些命令。我添加了BernardMessageProducer,这一切似乎都有效。我想只将窗帘命令发送到异步总线,其余部分在本地处理。
这是可能的,我该怎么做。 我已经编写了一个命令路由器,但是在命令总线处理完消息之后。
谢谢
答案 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