Akka Actor ask and Type Safety

随声附和 提交于 2019-12-31 19:38:48

问题


How can I use Akka Actor ask and maintain type safety? or avoid using ask in favour of tells?

When calling ? or ask on an Akka Actor, a Future[Any] is returned and I have to do an explicit cast via future.mapTo[MyType].

I don't like losing this type safety. If I use Futures directly (with no actors) I can explicitly return Future[MyType] and maintain type safety.

My specific use case involves an actor delegating it's message to two child actors and then aggregating the results from those actors and returning that to the parent's sender. My parent's receive method looks similar to this approach in the Akka Docs:

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

Is there a better way to achieve my use case?


回答1:


Try typed actors. Basically they allow you to interact with an actor using strongly typed traits/interfaces rather than by exchanging messages. Behind the scenes Akka implements these interfaces with a dynamic proxy and does the asynchronous magic.

Typed actor can return have methods with different, strongly typed return values (from documentation mentioned above):

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

These method represents tell while the remaining ones are different flavours of ask.




回答2:


I wanted to post a new answer because @Roland Kuhn recently presented a new solution for this called Typed Channels:

val f: Future[MyType] = actor <-?- message
  • Roland's Presentation
  • In the Akka docs


来源:https://stackoverflow.com/questions/13630585/akka-actor-ask-and-type-safety

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!