2013-05-06 16 views
13

Ho il seguente codice all'interno di un attoreAkka: Invia un messaggio futuro ad un attore

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     val zender = sender 
     future onComplete { 
      case Success(list) => zender ! list 
      case Failure(throwable) => zender ! List() 
     } 
    } 
} 

non mi piace come devo usare la funzione onComplete per inviare il risultato di nuovo l'attore mittente. Mi piacerebbe sapere se è possibile convertirla in qualcosa di simile:

def receive = { 
    case All() => { 
     val collection: BSONCollection = db("ping") 
     val future:Future[List[Ping]] = collection.find(BSONDocument()).cursor[Ping].toList() 
     "sender ! future" // one option 
     "future.map(list => sender ! list)" //Another option. I know it's not map, but maybe another function   
    } 
} 

ritengo che questo scorre meglio con il futuro concatenamento.

+0

non funziona il primo approccio? –

+0

@Alex Sì, ma la pipa è molto più elegante. – Luciano

+0

OK. Ma stai dicendo ** Non mi piace come devo usare la funzione onComplete per inviare il risultato al mittente. ** e il tuo codice fa esattamente questo - stai inviando il risultato al mittente . –

risposta

29

È possibile utilizzare il modello di tubo per quello. Solo import akka.pattern.pipe e quindi sarai in grado di inviare messaggi da futures a attori con future pipeTo actor.

+1

Sì, questo è quello che stavo cercando, grazie! – Luciano

11

Se si desidera avere una lista vuota quando si verifica un errore, probabilmente si desidera avere chiamate concatenate di "recover" e "pipeTo".

Problemi correlati