17

如何使用 Akka Actor 询问和维护类型安全?或者避免使用询问来支持告诉?

在Akka Actor 上调用?或时,会返回 a ,我必须通过.askFuture[Any]future.mapTo[MyType]

我不喜欢失去这种类型的安全性。如果我直接使用 Futures(没有参与者),我可以显式返回Future[MyType]并维护类型安全。

我的具体用例涉及一个演员将它的消息委托给两个子演员,然后汇总这些演员的结果并将其返回给父母的发件人。我父母的接收方法看起来类似于 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

有没有更好的方法来实现我的用例?

4

2 回答 2

9

我想发布一个新答案,因为@Roland Kuhn 最近为此提出了一个名为 Typed Channels 的新解决方案:

val f: Future[MyType] = actor <-?- message
于 2013-03-09T19:05:23.127 回答
8

试试打字演员。基本上,它们允许您使用强类型特征/接口与参与者交互,而不是通过交换消息。在幕后,Akka 使用动态代理来实现这些接口并执行异步魔法。

类型化的actor可以返回具有不同的强类型返回值的方法(来自上述文档):

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.

于 2012-11-29T18:08:19.950 回答