akka:使用akka-typed实现活动对象模式

时间:2015-07-20 14:52:48

标签: scala akka akka-typed

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, _))
}

干杯

1 个答案:

答案 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可以共享相同的资源更有效的执行,它们可以形成有原则的故障处理等的监督层次结构。