Ich habe einen Akteur, der Datenbankaktualisierungen orchestriert. Ich muss sicherstellen, dass jede Operation erst ausgeführt wird, nachdem die vorherige abgeschlossen wurde. Dies, weil Operation B das Ergebnis von Operation A wiederverwenden wird.Ich muss Operationen nacheinander mit Akka ausführen
Hier der Code, den ich für den Schauspieler schrieb.
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) =>
//
}
}
}
Der Code funktioniert für eine einzelne Operation. Wenn ich zwei Aktualisierungen feuere, wird die zweite asynchron ausgeführt, so dass sie gestartet wird, bevor die erste abgeschlossen ist.
Ich habe über verschiedene Arten von Mailbox gelesen, nicht sicher, ob eine andere helfen würde.
Irgendwelche Vorschläge?
das hat sehr gut funktioniert. Ich hatte erwartet, dass der Future-Block den Actor beschäftigt hält und erst nach dem nächsten Block mit der nächsten Nachricht fortfahren soll. Was vermisse ich? – abx78
Callbacks, die Sie in einem 'Future' registrieren (wie' onComplete' in Ihrem Fall), laufen asynchron ab, wahrscheinlich in einem ganz anderen Thread. Das bedeutet, dass die Codeausführung im aktuellen Thread fortgesetzt wird. In deinem Fall gibt es nach diesem "Future" keinen weiteren Code mehr, so dass der Akteur die Behandlung dieser Nachricht abschließt und zur nächsten übergeht. Du musst deshalb 'Future's und Schauspieler vorsichtig mischen. – cmbaxter
genial, danke für die Erklärung. – abx78