最近我发现自己在课堂上包装了演员,这样我就可以在处理ActorRef
时找回一些我丢失的类型。
问题是,最后,我不仅需要发送特定的消息,还需要将响应转换为预期的结果。
所以我认为我可以向包含Promise
的演员发送消息,以便他们最终能够报告结果。
这是个坏主意吗?它对我来说看起来很漂亮......类型安全并且效果一样好。为什么没有人有这个想法?我没有注意到它有什么问题吗?
询问基于模式的解决方案
case class GetUser(id:Long)
(actorRef ! GetUser(1l)).mapTo[User]
class UserRepoActor extends Actor{
def receive={
case GetUser(id)=>
sender() ! getUser(id)
}
...
}
基于承诺的解决方案
case class GetUser(id: Long, resp: Promise[User])
val req = GetUser(1l,Promise())
actorRef ! req
req.resp.future // No casting!!
class UserRepoActor extends Actor{
def receive={
case GetUser(id,resp)=>
response.success(getUser(id))
}
...
}
答案 0 :(得分:1)
Promise
将不适用于分布式actor系统。
至少,没有额外的努力。
答案 1 :(得分:0)
没有错。 akka typed使用了非常接近的方法,唯一的区别是:发送一次性Map[String, String]
而不是ActorRef[T]
答案 2 :(得分:0)
询问模式肯定更好。
1)演员应该不共享任何状态,并通过消息与外部世界互动。履行承诺实际上是一个变异的共享变量
2)将有状态对象传递给actor的创建者(例如promise)会在重启时打破actor的生命周期
所以基于承诺的方法在简单的情况下起作用。但是如果你像那样使用它可能你根本不需要像akka这样复杂的东西?