2015-01-04 17 views

risposta

6

squadra L'Akka raccomanda messaggio deve essere definito nello stesso luogo il metodo props dovrebbe essere: in the Receiver's Companion object perché il ricevitore implementa la funzione parziale receive e ha bisogno di conoscere tutti i messaggi che supporta. Inoltre, più mittenti possono inviare una serie di messaggi (implementati dal Destinatario), quindi non è possibile inserirli in un singolo mittente.

+0

Potresti ampliare * * Il team di Akka consiglia "*? Una pagina web sarebbe appropriata. –

+3

Noi consigliamo questo :-) Aggiunto un link ai documenti per la risposta di Soumya => http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practices –

+0

Grazie Konrad! –

3

Se the official Typesafe Activator template activator-akka-scala-seed è di qualche importanza per quanto riguarda le buone pratiche di Akka i messaggi dovrebbero essere parte di oggetto associato, come mostrato nella PingActor attore seguente (copiato direttamente dal modello):

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

Nota PingActor che contiene tutte le messaggi accettati dall'attore (come avrete notato che non è seguito rigorosamente dal momento che anche PongActor.PongMessage è accettato, ma non definito nell'oggetto associato PingActor).

Da un'altra domanda How to restrict actor messages to specific types?ilViktor said:

La pratica comune è quella di dichiarare quali messaggi attore può ricevere nell'oggetto compagna dell'attore, che lo rende molto più facile sapere cosa può ricevere.

+1

In realtà questo esempio mostra che i tipi di messaggio possono essere (ri) usati tra diversi attori. Forse è una buona pratica mettere i messaggi _command_ nell'oggetto complementare dell'attore ricevente e dei messaggi _event_ altrove? Qui il 'PingMessage' dovrebbe ** non ** essere nell'oggetto compagno' PingActor', perché questo attore non riceve questo messaggio. Il posto giusto è l'oggetto compagno del 'PongActor'. Il 'PongMessage' dovrebbe essere nell'oggetto compagno' PingActor' ricevente. Ma è event-ish e potrebbe essere definito in un oggetto neutro ed emesso anche da altri attori. – Sebastian

+0

@Sebastian suona un po 'troppo complicato per i miei gusti. Se qualcuno ti chiede "dove" non saresti in grado di rispondere subito - usiamo semplici regole qui "nel compagno" è facile da ricordare, e ha senso in quanto è "il ragazzo che li capisce", pensaci come questo "è quel ragazzo * protocollo *". –

+0

@ Konrad'ktoso'Malawski Mi piacciono 3 cose nel tuo commento: 1. convenzioni, 2. protocolli e 3. trattare oggetti/attori come esseri viventi _talking_ l'uno con l'altro. Ma la domanda iniziale era: _Dove dovrei dichiarare i messaggi? Nell'oggetto companion receiver o nell'oggetto companion del mittente?_ Scusate se sono troppo severo, ma nell'esempio precedente non è ovvio in quale oggetto companion debbano essere dichiarati 'PingMessage' e' PongMessage'. Il 'PongActor' ricevente dovrebbe convenzionalmente comprendere il' PingMessage' nel suo _protocol_, non è vero? ;-) – Sebastian

Problemi correlati