2012-01-26 11 views
1

アクターと作業する場合、アクターが複数の他のアクターと協力して要求を満たす必要がある場合、ここではどのようなアプローチが推奨されますか?より正確には、(メッセージMを処理することによって)アクタAがアクタB + Cから情報を取得する必要がある場合、アクタB + Cに対して非同期にメッセージを送信することができるが、アクタB + Cからの応答をどのように相関させるべきか元のメッセージM?アクターとの複数のメッセージの送信+処理

私はAkkaフレームワークを見てきましたが、これがどのように行われているのかわからないので、アクターが送信されたメッセージを追跡し、応答を元のメッセージ。この種の動作が様々なActorフレームワークに組み込まれていると思ったので、私は何かを見逃しているに違いありません。

答えて

1

新しいアクターを作成し、それを使用してコンテキストを保持し、タイムアウト後または「結合」を実行した後に停止します。また、代わりに俳優を産卵の将来の組成を使用することができます :

class A extends Actor { 
    def receive = { 
    case DoX(x) => 
     val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult] 
     val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult] 
     b zip c map { case (b,c) => merge(b,c) } pipeTo sender 
    } 
    } 
} 

またはデータフロー:

class A extends Actor { 
    def receive = { 
    case DoX(x) => flow { 
     val b = actorB ? DoYourPartOf(x) mapTo manifest[BResult] 
     val c = actorC ? DoYourPartOf(x) mapTo manifest[CResult] 
     merge(b(),c()) 
     } pipeTo sender 
    } 
    } 
} 
1

通常、メッセージを送信して相関応答を取得する必要がある場合、レスポンダーがその返答とともに返さなければならない元のメッセージのノンスの数。これは明示的にすることも、メッセージングレイヤーでサポートすることもできます。 Akkaについてはわかりませんが、ErlangがOTPでRPCを処理する方法です。

関連する問題