2015-07-20 33 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很多的消息驅動架構的優勢,即許多參與者可以共享相同的資源以實現更高效的執行,並且可以形成原則性失敗處理等的監督等級。