私の現在のアプリケーションは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
}
}
を次のように
は、現時点では、典型的な実行方法が見えます。このユースケースで使用するのは理にかなっていますか?もしそうなら、適切な解決策は何でしょうか?
おかげで、。私はすぐにそれを試してみるでしょう。そうです、主な目的は、将来のコールを連鎖させることです。それに加えて、アクターは、いくつかのプロジェクト分析管理タスクを処理します。 – Steffen
私はこのコードのほとんどをリファクタリングしました。それは完全に動作します! – Steffen