Durante la ricezione di eventi, Akka Actors elaborerà un messaggio alla volta, bloccando finché una richiesta non è stata completata prima di passare al messaggio successivo.Attendere la chiamata futura asincrona prima dell'elaborazione del messaggio successivo in Akka
Questo funziona bene per le attività sincrone/di blocco, tuttavia se si desidera eseguire una richiesta asincrona/non bloccante, Akka continuerà l'elaborazione senza attendere il completamento dell'attività.
Ad esempio:
def doThing():Future[Unit] = /* Non blocking request here */
def receive = {
case DoThing => doThing() pipeTo sender
}
Questo chiamerà doThing() e avviare l'elaborazione del futuro, ma non aspetterà che sia completato prima di elaborare il messaggio successivo - sarà semplice eseguire i seguenti messaggi nella coda più velocemente possibile.
In sostanza, sembra che Akka consideri che "restituire un futuro" sia "finito di elaborare" e passare al messaggio successivo.
Al fine di elaborare un messaggio alla volta, sembra che ho bisogno di bloccare attivamente il filo attore per fermarlo farlo
def receive = {
case DoThing => sender ! blocking(Await.result(doThing()))
}
Questo si sente come un approccio molto sbagliato - è artificialmente bloccando un thread nel codice che dovrebbe altrimenti essere completamente non-bloccante.
Quando si confronta Akka con, per esempio, con gli attori di elisir, possiamo facilmente evitare questo problema in primo luogo utilizzando una coda per richiedere il messaggio successivo senza dover bloccare artificialmente.
C'è un modo in Akka a uno
a) Attendere un Future
per completare prima di elaborare il messaggio successivo senza bloccare il thread.
b) Utilizzare una chiamata coda esplicita o qualche altro meccanismo per utilizzare un flusso di lavoro basato su pull anziché basato su push?
Forse un modello di tiratura del lavoro sarebbe adatto alle tue esigenze: quando il Futuro è completo, puoi farla accodare un nuovo messaggio per elaborare il risultato. – childofsoong
L'attore deve bloccare o gestire i messaggi in arrivo in qualche modo, per tenere il passo con le richieste. Se l'interruzione dell'elaborazione è la cosa più naturale da fare, è possibile utilizzare comportamenti diversi in base allo stato di elaborazione e nascondere i messaggi per la durata dell'azione asincrona, vedere http://doc.akka.io/docs/akka/snapshot /scala/actors.html#Become_Unbecome e http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Stash –