Ich entwickle eine Anwendung mit Akka, und eine Sache, die mir die ganze Zeit Probleme bei der Nachricht Erklärung mit der Actor
's. Wo soll ich die Nachrichten deklarieren? In den Empfängern Companion-Objekt oder das Begleitobjekt des Senders oder auf einem dritten Platz?Wohin sollen Akteursmeldungen gemeldet werden?
Antwort
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.
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.
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
@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 *". –
@ 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
- 1. Wohin sollen Android-Anwendungen SQLite getWritableDatabase aufrufen?
- 2. Rails - Wohin sollen Controller-Helfer gehen?
- 3. Sollen Einwegartikel weitergegeben werden?
- 4. Sollen Maßeinheiten lokalisiert werden?
- 5. Wohin sollen Assets in einem Code-Igniter-Projekt gehen?
- 6. Kommentare werden automatisch gemeldet und deaktiviert
- 7. PDF-Dateien werden als beschädigt gemeldet
- 8. Sollen Dialoge automatisch geschlossen werden?
- 9. Sollen Meteor-Publikationsfunktionen benannt werden?
- 10. Welche Edelsteine sollen installiert werden?
- 11. Sollen Interop-Baugruppen signiert werden?
- 12. Wie sollen NSTableCellViews angelegt werden?
- 13. Sollen die Reduzierungen verschachtelt werden?
- 14. Wann statische Variablen/Methoden verwendet werden sollen und wann Instanzvariablen/Methoden in Java verwendet werden sollen?
- 15. Sollen IDE-Projektdateien unter Versionskontrolle gestellt werden?
- 16. Sollen Benutzerdaten in einer Konfigurationsdatei gespeichert werden?
- 17. Sollen Lookup-Werte als Aggregatwurzeln modelliert werden?
- 18. Sollen `! Var` oder` var == NULL` verwendet werden?
- 19. Sollen UseLayoutRounding & SnapsToDevicePixels immer verwendet werden?
- 20. Wie sollen Unit Tests dokumentiert werden?
- 21. Sollen Instanz-/Klassenfelder in Delphi vorangestellt werden?
- 22. Eingabenamen, die nicht verwendet werden sollen?
- 23. Sollen Sitemap-Anfragen schnell geladen werden?
- 24. Sollen SQLConnection von ReliableSqlConnection geschlossen werden?
- 25. Wann dynamisch erstellte Objekte freigegeben werden sollen
- 26. Wann benutzerdefinierte Steuerelemente verwendet werden sollen
- 27. Wie sollen die hundertsten Geburtsdatenfelder gehandhabt werden?
- 28. Sollen statische Variablen durch Enums ersetzt werden?
- 29. Sollen die Singleton-Methoden synchronisiert werden?
- 30. Sollen Node.js-Apps in npm veröffentlicht werden?
Könnten Sie bitte erweitern auf * "Das Akka-Team empfiehlt" *? Eine Webseite wäre angemessen. –
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 –
Danke Konrad! –