2015-07-20 77 views
3

Akka Typed Actors文档指出它将被Akka Typed所取代。我从中推断出Akka Typed可以用来实现Active Object pattern;但对我来说不太清楚。这是我迄今为止的尝试;我知道太臭:dakka:使用akka类型来实现活动对象模式

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

PS有足够代表的人可以为'akka-typed'创建一个标签吗? – Mullefa

+0

关于标签:完成(标签描述待批准)。关于这个问题:你有什么尝试? –

+1

我编辑了我的问题,包括我试过的东西。 – Mullefa

回答

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)听起来还行按照经典的方式,但这样做foregoes很多的消息驱动架构的优势,即许多参与者可以共享相同的资源以实现更高效的执行,并且可以形成原则性失败处理等的监督等级。