Akka Typed Actors文档声明它将被Akka Typed取代。我推断,Akka Typed可用于实现Active Object pattern;但我不清楚如何。这是我到目前为止的尝试;我知道它很臭:D
object HelloWorld {
final case class Greet(whom: String, replyTo: ActorRef[Greeted])
final case class Greeted(whom: String)
private val greeter = Static[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
}
private val system = ActorSystem("HelloWorld", Props(greeter))
def greet(whom: String): Future[Greeted] = system ? (Greet(whom, _))
}
干杯
答案 0 :(得分:2)
您链接到的页面定义的活动对象模式由于删除TypedActors的所有原因而不可取:异步执行方法非常重要,不应被代理对象等技术隐藏实现普通接口。相反,Akka Typed允许您编写几乎相同的代码,就像它是一个活动对象一样,同时保留异步标记:而不是选择使用.
语法的方法,您使用?
发送消息(或!
如果协议不是简单的请求 - 响应)。你的例子看起来像这样:
object HelloWorld {
final case class Greet(whom: String)(replyTo: ActorRef[Greeted])
final case class Greeted(whom: String)
val greeter = Static[Greet] { msg ⇒
println(s"Hello ${msg.whom}!")
msg.replyTo ! Greeted(msg.whom)
}
}
object Sample extends App {
import HelloWorld._
val system = ActorSystem("HelloWorld", Props(greeter))
val fg = system ? Greet("John")
}
请注意,按照经典模式创建一个单独的线程(或ActorSystem)可能听起来不错,但这样做可以放弃消息驱动架构的许多好处,即许多Actors可以共享相同的资源更有效的执行,它们可以形成有原则的故障处理等的监督层次结构。