如何使用Akka Actor ask和维护类型安全?或者避免使用ask而倾向于tells?
在Akka Actor上调用?
或ask
时,会返回一个Future[Any]
,我必须通过future.mapTo[MyType]
进行显式强制转换。
我不喜欢失去这个类型的安全性。如果我直接使用Futures (没有参与者),我可以显式地返回Future[MyType]
并维护类型安全。
我的特定用例涉及一个参与者将其消息委托给两个子参与者,然后聚合来自这两个参与者的结果,并将结果返回给父参与者的发送者。我父母的接收方法类似于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
有没有更好的方法来实现我的用例?
发布于 2012-11-30 02:08:20
试试typed actors。基本上,它们允许您使用强类型的特征/接口与参与者交互,而不是通过交换消息。在幕后,Akka使用动态代理实现了这些接口,并实现了异步魔术。
类型化的参与者可以返回具有不同的强类型返回值的have方法(来自上面提到的文档):
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
这些方法代表tell
,而剩下的方法则是不同风格的ask
。
https://stackoverflow.com/questions/13630585
复制相似问题