scala - actors - Akka Actor pregunta y escribe Safety
akka actor watch (2)
Prueba actores tipeados . Básicamente, le permiten interactuar con un actor utilizando rasgos / interfaces fuertemente tipados en lugar de intercambiar mensajes. Detrás de escena, Akka implementa estas interfaces con un proxy dinámico y realiza la magia asincrónica.
El actor mecanografiado puede volver a tener métodos con valores de devolución diferentes, fuertemente tipados (a partir de la documentación mencionada anteriormente):
def squareDontCare(i: Int): Unit //fire-forget
def square(i: Int): Future[Int] //non-blocking send-request-reply
def squareNowPlease(i: Int): Option[Int] //blocking send-request-reply
def squareNow(i: Int): Int //blocking send-request-reply
Este método representa tell
mientras que los restantes son diferentes sabores de ask
.
¿Cómo puedo usar Akka Actor para preguntar y mantener el tipo de seguridad? o evite usar ask a favor de tells?
¿Cuándo llama ?
o ask
sobre un Actor de Akka, se devuelve un Future[Any]
y tengo que hacer un lanzamiento explícito a través de future.mapTo[MyType]
.
No me gusta perder este tipo de seguridad. Si uso futuros directamente (sin actores) puedo devolver explícitamente Future[MyType]
y mantener la seguridad del tipo.
Mi caso de uso específico involucra a un actor delegando su mensaje a dos actores secundarios y luego agregando los resultados de esos actores y devolviéndolo al remitente del padre. El método de recepción de mis padres es similar a este enfoque en los documentos de Akka:
http://doc.akka.io/docs/akka/2.0/scala/futures.html#For_Comprehensions
val f1 = actor1 ? msg
val f2 = actor2 ? msg
val f3 = for {
a ← f1.mapTo[Int]
b ← f2.mapTo[Int]
c ← ask(actor3, (a + b)).mapTo[Int]
} yield c
¿Hay una mejor manera de lograr mi caso de uso?
Quería publicar una nueva respuesta porque @Roland Kuhn presentó recientemente una nueva solución para este llamado Typed Channels:
val f: Future[MyType] = actor <-?- message