2016-08-07 1 views
3

私はコマンドバスを起動してしばらく稼働させて、今は非同期に処理したいコマンドがいくつかあります。私はBernardMessageProducerを追加しました。すべてがうまくいくようです。カーテンコマンドを非同期バスに送信し、残りはローカルで処理するようにしたいと思います。Proof、ローカルバスを介していくつかのメッセージをどのようにルーティングするのですか?BernardMessageProducerによって他のメッセージをルーティングするには

これは可能なのですか?どうすればいいですか? 私は既にコマンドルーターを書いていますが、コマンドバスがメッセージを処理した後です。

は、私は(あなたが任意のコードサンプルを提供しなかったespaciallyので)このWIHのproophを行う方法がわからないんだけど

+0

1)どのフレームワークでプロホックスコンポーネントを使用していますか? 2)これを同じコードベースにしたいですか? –

+0

私はSymfony3でプロジェクトを書いていますが、同じコードベースをどういう意味ですか? –

答えて

0

ありがとうございますが、一般的に言えば:良いアプローチはマティアスNobackの中に見つけることができる可能ですCommand BusのドキュメントのMessageBusリポジトリ。

たとえば、次のようなチェックを行うミドルウェアを作成できます。 (上記のリンク先の例のように)マーカーインタフェース用:

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を使用したいと思うかもしれません。適切なコマンドバスにそのクラス名を指定します。あなたはProoph \ ServiceBusを取り付けることによって、そうすることができる非同期(async)すべてのメッセージを処理するバスを設定したい場合は、再び\ readme

から特に同じドキュメント内のセクションDefining the command handler mapDelegatesToMessageHandlerInterface

+0

Prooph CQRSフレームワークはSimpleBusとは少し異なる動作をします。私はそれがバスに行く前にそれを早く経路指定できるかどうか疑問に思っていましたが、おそらく後にルーティングすることができました。 –

2

マティアスNobackのドキュメントを参照してくださいPlugin \ MessageProducerPluginは、選択したメッセージプロデューサをメッセージバスに初期化します。

は、あなたがメッセージルータのプラグインを使用して、メッセージプロデューサへのルート個々のメッセージをも

//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); 

PSB-zeromqプロデューサーをすることができます使用して、簡単な例を見てみましょう。

注:Proof \ ServiceBus \ Plugin \ Router \ RegexRouterは、特定の名前空間asyncのすべてのメッセージを処理する場合に適しています。

+0

メッセージルーターを使用して個々のメッセージをメッセージプロデューサにリダイレクトするコードを追加しました。これはすべて動作しますが、その後に脱落し、デフォルトハンドラを使用しようとします。 $アクションイベント - > setParam(MessageBus :: EVENT_PARAM_MESSAGE_HANDLED、true); ' ActionEventの処理を停止するにはどうしたらいいですか? –

関連する問題