2011-07-13 9 views
6

私の現在のアプリケーションはakka 1.1に基づいています。特定のプロジェクトの分析タスクの処理を担当する複数のProjectAnalysisActorsがあります。このようなアクタが一般的な開始メッセージを受信すると、分析が開始されます。 1つのステップを終了すると、それは長いものが定義されると次のステップでメッセージを送信します。実行コードは基本的には次のようになります。ブロッキングアクターメッセージは、将来ラップされても使用できますか?


sealed trait AnalysisEvent { 
    def run(project: Project): Future[Any] 
    def nextStep: AnalysisEvent = null 
} 

case class StartAnalysis() extends AnalysisEvent { 
    override def run ... 
    override def nextStep: AnalysisEvent = new FirstStep 
} 

case class FirstStep() extends AnalysisEvent { 
    override def run ... 
    override def nextStep: AnalysisEvent = new SecondStep 
} 

case class SecondStep() extends AnalysisEvent { 
    ... 
} 

class ProjectAnalysisActor(project: Project) extends Actor { 

    def receive = { 
     case event: AnalysisEvent => 
      val future = event.run(project) 
      future.onComplete { f => 
       self ! event.nextStep 
      } 
    } 

} 

各解析ステップの実行メソッドのコードを実装する方法にはいくつかの困難があります。現時点では、それぞれの実行方法の中で新しい未来を創造します。この未来の中で、私はすべてのフォローアップメッセージをさまざまなサブシステムに送ります。それらのうちのいくつかは、ノンブロッキングの忘却メッセージですが、一部のメッセージは、次の分析ステップが開始される前に保存する必要があります。これらのブロッキングのメッセージを避けなければならないので、これは正しい方法であれば、私は思ったんだけど


def run(project: Project): Future[Any] = { 
    Future { 
     progressActor ! typicalFireAndForget(project.name) 
     val calcResult = (calcActor1 !! doCalcMessage(project)).getOrElse(...) 

     val p: Project = ... // created updated project using calcResult 

     val result = (storage !! updateProjectInformation(p)).getOrElse(...) 
     result 
    } 
} 

を次のように

は、現時点では、典型的な実行方法が見えます。このユースケースで使用するのは理にかなっていますか?もしそうなら、適切な解決策は何でしょうか?

答えて

7

明らかに、ProjectAnalysisActorの唯一の目的は、将来のコールを連鎖させることです。第二に、実行メソッドは、計算を続行するために結果を待つことも考えられます。

だから私はあなたがここで説明したように、今後の作曲を使用するようにコードをリファクタリングしてみてくださいと思う:有望に見えるhttp://akka.io/docs/akka/1.1/scala/futures.html

def run(project: Project): Future[Any] = { 
    progressActor ! typicalFireAndForget(project.name) 
    for( 
     calcResult <- calcActor1 !!! doCalcMessage(project); 
     p = ... // created updated project using calcResult 
     result <- storage !!! updateProjectInformation(p) 
) yield (
    result 
) 
} 
+0

おかげで、。私はすぐにそれを試してみるでしょう。そうです、主な目的は、将来のコールを連鎖させることです。それに加えて、アクターは、いくつかのプロジェクト分析管理タスクを処理します。 – Steffen

+0

私はこのコードのほとんどをリファクタリングしました。それは完全に動作します! – Steffen

関連する問題