Domanda:modello corretto per accumulare stato in un attore Akka
Qual è il modello corretto per accumulare stato in un attore Akka?
Contesto:
Diciamo che ho un paio di servizi che tutti i dati di ritorno.
class ServiceA extends Actor {
def receive = {
case _ => sender ! AResponse(100)
}
}
class ServiceB extends Actor {
def receive = {
case _ => sender ! BResponse("n")
}
}
// ...
voglio avere un controllo/supervisione attore che coordina a parlare con tutti questi servizi e tenere traccia delle loro risposte, poi l'invio di una risposta con tutti i dati indietro al mittente originale.
class Supervisor extends Actor {
def receive = {
case "begin" => begin
case AResponse(id) => ???
case BResponse(letter) => ???
}
// end goal:
def gotEverything(id: Int, letter: String) =
originalSender ! (id, letter)
def begin = {
ServiceA ! "a"
ServiceB ! "b"
}
}
All'inizio delle risposte di servizio, come posso mantenere tutto questo stato associato? A quanto ho capito, se dovessi assegnare il valore di AResponse a, diciamo, var aResponse: Int
, quella variabile cambierà costantemente mentre vengono ricevuti messaggi diversi e non è possibile che io conti su quello var
rimanendo mentre aspetto il messaggio BResponse
.
Mi rendo conto che potrei usare ask
e solo nidificare/flatMap Future
, ma da quello che ho letto è un cattivo schema. C'è un modo per ottenere tutto questo senza Future?
Perché "aResponse' cambia più di una volta? Si invia solo un messaggio a 'ServiceA'. Qual è il tuo obiettivo esattamente? Aspetta di ricevere 'AResponse' e' BResponse' e chiama 'gotEverything' con i loro valori? – vptheron
>> Qual è il tuo obiettivo esattamente?Aspetta di ricevere AResponse e BResponse e chiama GotTutto con i loro valori? SI –
puoi memorizzare le risposte in una lista con qualche identificatore o attore ref – wedens