2013-05-06 17 views
13

Mam następujący kod wewnątrz aktoraAkka: Wyślij wiadomość do przyszłego aktora

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() 
     } 
    } 
} 

Nie lubię jak muszę użyć funkcji onComplete wysłać wynik z powrotem do nadawcy aktora. Chciałbym wiedzieć, czy można go przekonwertować na coś takiego:

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   
    } 
} 

Uważam, że to płynie lepiej z przyszłym łańcuchem.

+0

Czy Twoje pierwsze podejście nie działa? –

+0

@Alex Tak, ale fajka jest bardziej elegancka. – Luciano

+0

W porządku. Ale mówisz ** Nie podoba mi się, jak muszę użyć funkcji onComplete, aby wysłać wynik do aktora nadawcy ** i twój kod robi dokładnie to - przesyłasz wynik z powrotem do aktora nadawcy . –

Odpowiedz

29

Można użyć wzoru rury dla tego. Po prostu import akka.pattern.pipe, a następnie będziesz mógł przesyłać wiadomości z przyszłości do aktorów z numerem future pipeTo actor.

+1

Tak, właśnie tego szukałem, dzięki! – Luciano

11

Jeśli chcesz mieć pustą listę, gdy wystąpi awaria, prawdopodobnie chcesz mieć połączone połączenia "odzyskać" i "potoczyć".

Powiązane problemy