2015-01-04 48 views

回答

6

的阿卡組建議消息應該在同一個地方props方法應該是被定義:in the Receiver's Companion object因爲接收機實現receive部分功能和需要知道所有其支持的消息。另外,多個發件人可以發送一組消息(由Receiver實現),因此您不能將其放入單個發件人。

+0

能否請您擴大*「的阿卡團隊建議」 *?一個網頁將是適當的。 –

+3

我們做推薦這種:-)增加了一個鏈接到文檔到Soumya的答案=> http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practices –

+0

感謝康拉德! –

3

如果the official Typesafe Activator template activator-akka-scala-seed是關於阿卡的良好做法的信息應儘可能表現在以下PingActor演員(直接從模板複製)同伴對象的一部分的任何重要性:

package com.example 

import akka.actor.{Actor, ActorLogging, Props} 

class PingActor extends Actor with ActorLogging { 
    import PingActor._ 

    var counter = 0 
    val pongActor = context.actorOf(PongActor.props, "pongActor") 

    def receive = { 
    case Initialize => 
     log.info("In PingActor - starting ping-pong") 
     pongActor ! PingMessage("ping") 
    case PongActor.PongMessage(text) => 
     log.info("In PingActor - received message: {}", text) 
     counter += 1 
     if (counter == 3) context.system.shutdown() 
     else sender() ! PingMessage("ping") 
    } 
} 

object PingActor { 
    val props = Props[PingActor] 
    case object Initialize 
    case class PingMessage(text: String) 
} 

注意PingActor保存所有演員接受的消息(因爲您可能已經注意到它沒有嚴格遵守,因爲PongActor.PongMessage也被接受,但未在伴隨對象PingActor中定義)。

從另一個問題How to restrict actor messages to specific types?Viktor said

通常的做法是宣佈什麼消息的演員可以在演員的同伴對象,這使得它非常容易 知道接收 什麼它可以接收。

+1

其實這個例子表明消息類型可以(重新)用於不同的角色。將_command_消息放入接收actor的伴侶對象和其他地方的_event_消息可能是一個好習慣嗎?這裏'PingMessage'不應該**在'PingActor'伴隨對象中,因爲這個actor不會收到這個消息。正確的地方是「PongActor」的伴侶對象。 'PongMessage'應該在接收'PingActor'伴侶對象中。但它是事件 - 可以定義在一箇中立的對象中,也可以由其他演員發出。 – Sebastian

+0

@塞巴斯蒂安對我的口味聽起來有些複雜。如果有人問你:「這裏的」你不能馬上回答 - 讓我們用簡單的規則在這裏「中的伴侶」很容易記住,而且是有道理的,因爲它是「誰瞭解他們的傢伙」,想想它像這是「這是傢伙*協議*」。 –

+0

@ Konrad'ktoso'Malawski我喜歡您的評論3件事情:1公約,協議2和3治療對象/演員像活物_talking_彼此。但最初的問題是:我應該在哪裏宣佈消息?在接收器伴侶對象或發件人伴侶對象中?_對不起,如果我太嚴格了,但在上面的例子中,應該聲明「PingMessage」和「PongMessage」的伴隨對象並不明顯。接收的'PongActor'應該按照慣例理解他的_protocol_中的'PingMessage',不是嗎? ;-) – Sebastian