2015-01-04 12 views

Antwort

6

Das Akka Team empfiehlt Nachricht sollte die props Methode an der gleichen Stelle definiert werden sollten: in the Receiver's Companion object weil der Empfänger die receive Teilfunktion implementiert und muss über alle Nachrichten wissen, es unterstützt. Außerdem können mehrere Absender eine Reihe von Nachrichten senden (die vom Empfänger implementiert werden), sodass Sie sie nicht in einem einzigen Absender ablegen können.

+0

Könnten Sie bitte erweitern auf * "Das Akka-Team empfiehlt" *? Eine Webseite wäre angemessen. –

+3

Wir empfehlen das :-) Einen Link zu den Dokumenten zu Soumyas Antwort hinzugefügt => http://doc.akka.io/docs/akka/2.3.8/scala/actors.html#recommended-practices –

+0

Danke Konrad! –

3

Wenn the official Typesafe Activator template activator-akka-scala-seed ist von Bedeutung in Bezug auf Akka gute Praktiken die Nachrichten Teil des Begleitobjekts sein sollten wie in den folgenden PingActor Schauspielern gezeigt (direkt aus der Vorlage kopiert):

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

Hinweis PingActor, die alle hält die akzeptierte Nachrichten des Schauspielers (wie Sie vielleicht bemerkt haben, wird es nicht streng befolgt, da PongActor.PongMessage ebenfalls akzeptiert wird, aber nicht im Begleitobjekt PingActor definiert ist).

Aus einer anderen Frage How to restrict actor messages to specific types?dieViktor said:

Die gängige Praxis zu erklären ist, welche Nachrichten Schauspieler im Begleitobjekt des Schauspielers empfangen können, die es viel einfacher sehr machen zu wissen, was es kann empfangen.

+1

Tatsächlich zeigt dieses Beispiel, dass Nachrichtentypen über verschiedene Akteure (wieder) verwendet werden können. Vielleicht ist es eine gute Übung, die Nachrichten _command_ in das Companion-Objekt des empfangenden Akteurs und die _event_-Nachrichten an anderer Stelle zu setzen? Hier sollte die PingMessage ** nicht ** im Companion-Objekt "PingActor" enthalten sein, da dieser Akteur diese Nachricht nicht empfängt. Der richtige Ort ist das Begleiterobjekt des 'PongActor'. Die 'PongMessage' sollte im empfangenden 'PingActor'-Begleitobjekt enthalten sein. Aber es ist Ereignis-isch und könnte in einem neutralen Objekt definiert und auch von anderen Akteuren ausgestrahlt werden. – Sebastian

+0

@Sebastian klingt ein bisschen zu kompliziert für meinen Geschmack. Wenn dich jemand fragt "wo" würdest du nicht sofort antworten können - lass uns einfache Regeln hier verwenden "im Begleiter" ist leicht zu merken, und macht Sinn, weil es "der Typ ist, der sie versteht", denke darüber nach das ist "das Jungs-Protokoll *". –

+0

@ Konrad'ktoso'Malawski Ich mag 3 Dinge in deinem Kommentar: 1. Konventionen, 2. Protokolle und 3. Behandeln von Objekten/Schauspielern wie Lebewesen, die miteinander reden. Aber die erste Frage war: Wo soll ich die Nachrichten erklären? Im Begleitobjekt des Empfängers oder in dem Begleitobjekt des Absenders?_ Tut mir leid, wenn ich zu streng bin, aber im obigen Beispiel ist nicht klar, in welchem ​​Begleitobjekt die 'PingMessage' und die' PongMessage' deklariert werden sollen. Der empfangende 'PongActor' sollte per Konvention die' PingMessage' in seinem _Protocol_ verstehen, oder? ;-) – Sebastian

Verwandte Themen