コマンドバスをしばらく稼働させ、多くのアプリケーションを開発しました。今、非同期で処理したいコマンドがいくつかあります。BernardMessageProducer を追加しましたが、すべて動作しているようです。カーテン コマンドのみを非同期バスに送信し、残りはローカルで処理したいと考えています。
これは可能ですか、どうすればできますか。私はすでにコマンドルーターを書いていますが、コマンドバスがメッセージを処理した後です.
ありがとうございました
リードミーより
すべてのメッセージを非同期で処理するバスをセットアップする場合は、選択したメッセージ プロデューサで初期化された 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 が適しています。
これを証明する方法はわかりませんが(特にコードサンプルを提供していないため)、一般的に言えば、Command Busのドキュメントにある Mathias Noback の 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 のドキュメント、特に同じドキュメント内のコマンド ハンドラ マップの定義セクションとDelegatesToMessageHandlerInterfaceを再度参照してください。