データベースの更新を調整している俳優がいます。前の操作が完了した後で各操作が実行されるようにする必要があります。 これは操作Bが操作Aの結果を再利用するためです。Akkaを使用して順次操作を実行する必要があります
ここでは俳優のために書いたコードです。
class DbUpdateActor(databaseOperations: DBProvider) extends Actor {
implicit val ec:ExecutionContext = context.system.dispatcher
def receive: Receive = {
case newInfo : UpdateDb =>
val future = Future {
// gets the current situation from DB
val status = databaseOperations.getSituation()
// do db update
databaseOperations.save(something)
}
future onComplete {
case Success(result: List[Int]) =>
//
case Failure(err: Throwable) =>
//
}
}
}
コードは1回の操作で正常に動作します。 2つの更新を起動すると、2番目の更新は非同期に実行されるため、最初の更新が完了する前に開始されます。
私は異なるタイプのメールボックスについて読んでいましたが、別のタイプのメールボックスがあれば役立つでしょうか。
提案がありますか?
非常にうまく機能しました。私は未来のブロックが、俳優を忙しくしておき、未来のブロックが完了した後で次のメッセージに進むことを期待していました。私は何が欠けていますか? – abx78
'Future'(あなたのケースでは' onComplete'のような)に登録するコールバックは、完全に別のスレッドよりも非同期的に処理されます。つまり、現在のスレッドでのコードの実行は継続されます。あなたのケースでは、 'Future'の後にコードがなくなるので、アクターはそのメッセージの処理を完了し、次のメッセージに移ります。このため、未来と俳優を混在させるように注意する必要があります。 – cmbaxter
すごく、説明のおかげで。 – abx78