2016-12-26 13 views
0

私は、主要なタスク同期アッカの俳優のベストプラクティス

俳優Aを完了する必要があり、次の要件

を持っています。メッセージは、それがために俳優のBに渡し「特別」である場合には、主要なタスクを実行します処理し、タスク アクターBを終了:主要なタスクのために特別な論理タスクを実行し、AとBは一緒にこの

実装

public static class ActorA extends UntypedActor { 


    public void onReceive(Object message) { 
    if (message instanceof Work) { 
    // if message is special 
ActorRef actorB = this.getContext().actorOf(Props.create(ActorB.class,)); 
       actorB.tell(new specialTask(message.property), getSelf()); 

    } else { 
     unhandled(message); 
    } 
    } 
} 
完了

俳優のB

public static class ActorB extends UntypedActor { 


     public void onReceive(Object message) { 
     if (message instanceof specialTask) { 
     //do special task using the message that does not change the state of the message 

     } else { 
      unhandled(message); 
     } 
     } 
    } 

ActorAは俳優Bsがタスクで完了を依存しません。しかし、完成したばかりの俳優BからAに渡すメッセージがなければならないかどうかはわかりません。これは正しいアプローチですか?

+0

作業コードはcodeview.stackexchange.comに移動する必要があります – GhostCat

+0

ありがとう、http://codereview.stackexchange.com/questions/150871/synchronised-akka-actor-best-practiceに投稿しました –

+0

質問はcoderview.stackexchangeで受け付けられません。 comので、私はここで試し続けます。ありがとう –

答えて

0

私が理解できる限り、アクターBを使用してAで計算すべきでないものを計算したいだけです。この場合、AがBによって作成された結果に依存しない場合、計算が完了したらBからAにメッセージを送る必要があります。 Bの計算結果(ディスクへの書き込み、別のサービスへのポストなど)で、あなたが望むものを何でもできます。

アクターBのメールボックスをAからのメッセージでオーバーフローさせないために、Work PullingまたはReactive StreamというAkkaパターンを使用することをお勧めします。主な考え方は、アクターBにタスクを要求することです。

BがI/O /重い作業/ブロックを行う場合は、このアクターを分離して実行することを強くお勧めします。dispatcherそうしないと、システム全体がシャットダウンされる可能性があります。

+0

こんにちは、ありがとうございました。俳優Bはブロック作業を実行しません。俳優が仕事を求めることを意味するパターンを教えてください。あなたがメッセージを送信する俳優の尋ねる方法について話しているなら、それは未来を返します。しかし、親の俳優は、俳優B –

+0

さんによって返された結果について気にしません。 Akka APIからの質問パターンではありません。私はあなたの俳優AがBよりも速くメッセージを生成するケースを考慮して、背圧を処理するもう一つの代替方法であるワークプリングパターンへのリンクとReactive Streamに関するリンクを追加しました。しかし、私が見る限り、あなたの最初のデザインには何も問題はありません。私は、コールをブロックしてメールボックスのオーバーフローを処理するために分離されたディスパッチャを使用する必要があることを理解するまでにはしばらく時間がかかり、問題を指摘しました。 –

+0

メッセージを受け取った後、送信者に確認がないことはちょっと変わったようです –

関連する問題