阿卡演员问及类型安全(Akka Actor ask and Type Safety)

2019-08-03 08:28发布

我如何使用阿卡演员问及保持类型安全? 或者避免使用要求赞成讲述了?

当调用?ask上阿卡演员,一个Future[Any]返回,我所要做的通过显式类型转换future.mapTo[MyType]

我不喜欢失去这种类型的安全性。 如果我使用期货直接(不带演员),我可以明确地返回Future[MyType]和维护类型安全。

我的具体使用情况涉及一个演员委派它的消息,两个小演员,然后从这些演员聚集的结果,并返回该给父母的发件人。 我父母的接收方法类似于在阿卡文档这种方式:

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

有没有更好的方式来实现我的使用情况?

Answer 1:

尝试类型的演员 。 基本上,它们允许你使用强类型化特质/接口而不是通过交换消息的演员互动。 幕后阿卡实现这些接口与动态代理并执行异步神奇。

类型化的演员可以返回具有不同的,强类型的返回值的方法(从文档上面提到的):

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



Answer 2:

我想发布一个新的答案,因为@Roland库恩最近提出这个叫类型化频道的新的解决方案:

val f: Future[MyType] = actor <-?- message
  • Roland的介绍
  • 在阿卡文档


文章来源: Akka Actor ask and Type Safety