Modul orbit_framework.messaging¶
Dieses Modul implementiert das Nachrichtensystem von ORBIT.
Das Modul umfasst die folgenden Klassen:
MessageBus¶
- class orbit_framework.messaging.MessageBus(core)¶
Diese Klasse implementiert das ORBIT-Nachrichtensystem.
Parameter
coreEin Verweis auf den Anwendungskern der ORBIT-Anwendung. Eine Instanz der Klasse
Core.
Beschreibung
Das Nachrichtensystem funktioniert nach dem Broadcast-Prinzip. Nachrichten werden von einem Absender an das Nachrichtensystem übergeben, ohne dass der Absender weiß, wer die Nachricht empfangen wird (
send()).Empfänger können sich mit einem Empfangsmuster (
Slot) bei dem Nachrichtensystem registrieren (add_listener()) und bekommen alle Nachrichten zugestellt, die ihrem Empfangsmuster entsprechen.Das Zustellen der Nachrichten (der Aufruf der Empfänger-Callbacks) erfolgt in einem dedizierten Thread. Das hat den Vorteil, dass das Versenden einer Nachricht ein asynchroner Vorgang ist, der den Absender nicht blockiert.
Jede Nachricht ist einem Ereignis zugeordnet. Dieses Ereignis ist durch einen Job, eine Komponente und einen Ereignisnamen definiert. Der Absender eines Ereignisses gibt beim Versenden einer Nachricht den Namen des Ereignisses an.
Um das Erzeugen von Empfangsmustern (
Slot) zu vereinfachen, können Jobs, Komponenten und Ereignisnamen zu Gruppen zusammengefasst werden (job_group(),component_group(),name_group()).- class Message(job, component, name, value)¶
Diese Klasse repräsentiert eine Nachricht im Nachrichtensystem. Sie wird nur intern verwendet.
- add_listener(listener)¶
Registriert einen Empfänger mit einem Empfangsmuster im Nachrichtensystem.
Das Empfangsmuster besteht aus den drei Attributen
job,componentundname. Diese Attribute können jeweils einen Namen, einen Gruppennamen oderNoneenthalten. Sie werden benutzt, um zu entscheiden, ob eine Nachricht an den Empfänger übergeben wird oder nicht.Üblichweise wird als Empfänger ein
Listener-Objekt verwendet, welches mit einemSlot-Objekt und einem Callback initialisiert wurde.Die Nachricht M: job ='A', component ='1', name ='a', value = …wird an alle Empfänger mit dem Empfangsmuster〈 job ='A', component ='1', name ='a'〉 übergeben.Existiert eine Ereignisnamengruppe mit dem Namen'x'und den Ereignisnamen'a',b','c', wird die Nachricht M auch an alle Empfänger mit dem Empfangsmuster〈 job ='A', component ='1', name ='x'〉 übergeben.Hat ein Attribut den WertNone, wird es ignoriert. Das bedeutet, die Nachricht M wird auch an alle Empfänger mit dem Empfangsmuster〈 job ='A', component ='1', name =None〉 übergeben.Der Empfänger muss den Aufruf als Funktion unterstützen. Er wird für die Übergabe der Nachricht mit den folgenden vier Parametern aufgerufen:
jobDer Name des versendenden Jobs
componentDer Name der versendenden Komponente
nameDer Name des Ereignisses
valueDer Nachrichteninhalt
Die Parameter werden in der dargestellten Reihenfolge als Positionsparameter übergeben.
Siehe auch:
Slot,Listener,remove_listener(),send()
- component_group(group_name, *names)¶
Richtet eine Absendergruppe auf Komponentenebene ein.
Parameter
group_nameDer Name der Gruppe.
names(var args)Die Namen der Komponenten, welche in der Gruppe zusammengefasst werden sollen.
Beschreibung
Durch eine Absendergruppe auf Komponentenebene kann ein Slot anstelle eines spezifischen Komponentennamens einen Gruppennamen im Empfangsmuster angeben.
Siehe auch:
Slot,Listener,add_listener(),remove_listener(),orbit_framework.Job.add_listener(),orbit_framework.Component.add_listener()
- job_group(group_name, *names)¶
Richtet eine Absendergruppe auf Job-Ebene ein.
Parameter
group_nameDer Name der Gruppe.
names(var args)Die Namen der Jobs, welche in der Gruppe zusammengefasst werden sollen.
Beschreibung
Durch eine Absendergruppe auf Job-Ebene kann ein Slot anstelle eines spezifischen Jobnamens einen Gruppennamen im Empfangsmuster angeben.
Siehe auch:
Slot,Listener,add_listener(),remove_listener(),orbit_framework.Job.add_listener(),orbit_framework.Component.add_listener()
- name_group(group_name, *names)¶
Richtet eine Absendergruppe auf Ereignisebene ein.
Parameter
group_nameDer Name der Gruppe.
names(var args)Die Namen der Ereignisse, welche in der Gruppe zusammengefasst werden sollen.
Beschreibung
Durch eine Absendergruppe auf Ereignisebene kann ein Slot anstelle eines spezifischen Ereignisnamens einen Gruppennamen im Empfangsmuster angeben.
Siehe auch:
Slot,Listener,add_listener(),remove_listener(),orbit_framework.Job.add_listener(),orbit_framework.Component.add_listener()
- remove_listener(listener)¶
Entfernt einen Empfänger und sein Empfangsmuster aus dem Nachrichtensystem.
Bemerkung
Es muss das gleiche Objekt übergeben werden, wie an
add_listener()übergeben wurde.Siehe auch:
add_listener()
- send(job, component, name, value)¶
Sendet eine Nachricht über das Nachrichtensystem.
Parameter
jobDer versendende Job
componentDie versendende Komponente
nameDer Ereignisname
valueDer Inhalt der Nachricht
Beschreibung
Die Nachricht wird in die Warteschlange eingestellt. Der Aufruf kehrt sofort wieder zum Aufrufer zurück.
Siehe auch:
add_listener()
- start()¶
Startet das Nachrichtensystem.
Zur Weiterleitung der Nachrichten wird ein dedizierter Thread gestartet.
Siehe auch:
stop()
- stop(immediate=False)¶
Beendet das Nachrichtensystem.
Parameter
immediate(optional)Truewenn wartende Nachrichten nicht mehr abgearbeitet werden sollen,Falsewenn erst alle wartenden Nachrichten abgearbeitet werden sollen.
Blockiert solange bis der dedizierte Thread für die Nachrichtenverteilung beendet wurde und kehrt erst anschließend zum Aufrufer zurück.
Siehe auch:
start()
- trace(text)¶
Schreibt eine Nachverfolgungsmeldung mit dem Ursprung
MessageBusauf die Konsole.
Slot¶
- class orbit_framework.messaging.Slot(job, component, name, predicate=None, transformation=None)¶
Diese Klasse repräsentiert ein Empfangsmuster für das Nachrichtensystem.
Parameter
jobDer Name des versendenen Jobs ein Gruppenname oder
None.componentDer Name der versendenen Komponente,
'JOB', ein Gruppenname oderNone.nameDer Ereignisname, ein Gruppenname oder
None.predicate(optional)Ein Prädikat als zusätzlicher Filter für Nachrichten. Eine Funktion mit der Signatur
(job, component, name, value), welche die Nachricht entgegennimmt undTrueoderFalsezurückgibt.transformation(optional)Eine Funktion, welche den Inhalt der Nachricht entgegennimmt und einen umgewandelten Inhalt zurückkgibt.
Beschreibung
Das Empfangsmuster wird verwendet, um ein Callback für den Nachrichtenempfang im Nachrichtensystem zu registrieren. Das Empfangsmuster kann durch einen Aufruf der Methode
listener()mit einem Callback zu einem Empfänger verknüpft werden.Für die Erzeugung von
Slot-Instanzen gibt es einige statische Factory-Methoden:for_job(),for_component()undfor_name().Siehe auch:
listener(),Listener- property component¶
Gibt den Namen der versendenden Komponente,
'JOB', einen Gruppennamen oderNonezurück.
- static for_component(job, component)¶
Erzeugt ein Empfangsmuster, welches auf die Nachrichten aller Komponenten mit dem übergegebenen Namen passt. Es kann auch ein Gruppenname übergegen werden.
- static for_job(job)¶
Erzeugt ein Empfangsmuster, welches auf alle Nachrichten von einem Job passt. Es kann auch ein Gruppenname übergegen werden.
- static for_name(name)¶
Erzeugt ein Empfangsmuster, welches auf alle Nachrichten für das übergebene Ereignis passt. Es kann auch ein Gruppenname übergegen werden.
- property job¶
Gibt den Namen des versendenden Jobs, einen Gruppennamen oder
Nonezurück.
- property name¶
Gibt den Ereignisnamen, einen Gruppenname oder
Nonezurück.
- property predicate¶
Gibt das Filterprädikat oder
Nonezurück.
- property transformation¶
Gibt die Transformationsfunktion für den Nachrichteninhalt oder
Nonezurück.
Listener¶
- class orbit_framework.messaging.Listener(callback, slot)¶
Diese Klasse repräsentiert einen Empfänger für das Nachrichtensystem.
Parameter
callbackDas Callback welches beim Eintreffen einer passenden Nachricht aufgerufen werden soll. Die Funktion muss die folgende Signatur besitzen:
(job, component, name, value). Wird eine dynamische Methode statt einer statischen Funktion übergeben, muss die Methode die folgende Signatur besitzen:(self, job, component, name, value).slotEin Empfangsmuster für die Filterung der Nachrichten.
Ein Empfänger kann mit Hilfe der folgenden Methoden für den Nachrichtenempfang registriert werden:
MessageBus.add_listener(),orbit_framework.Job.add_listener()undorbit_framework.Component.add_listener().Siehe auch:
Slot,MessageBus- property component¶
Gibt den Namen der versendenden Komponente,
'JOB', einen Gruppennamen oderNonezurück.
- property job¶
Gibt den Namen des versendenden Jobs, einen Gruppennamen oder
Nonezurück.
- property name¶
Gibt den Ereignisnamen, einen Gruppenname oder
Nonezurück.
- property receiver¶
Gibt die Bezeichnung des Empfängers zurück.
Die Bezeichnung wird beim Protokollieren der Nachrichten verwendet, um den Weg der Nachrichten kenntlich zu machen.
Werden die Methoden
orbit_framework.Job.add_listener()oderorbit_framework.Component.add_listener()verwendet, wird dieses Attribut automatisch gesetzt. Wird der Empfänger direkt mitMessageBus.add_listener()registriert, sollte dieses Attribut vorher gesetzt werden, um den Empfänger zu bezeichnen.
MultiListener¶
- class orbit_framework.messaging.MultiListener(name, callback)¶
Diese Klasse implementiert einen Mehrfachempfänger. Das ist ein Mechanismus für den Empfang von Nachrichten über das Nachrichtensystem, bei dem mehrere Empfangsmuster mit einem Callback verknüpft werden.
Parameter
nameDer Name des Empfängers.
callbackEine Funktion die bei einem Nachrichtenempfang aufgerufen werden soll. Die Funktion muss die Signatur
(job, component, name, value)besitzen.
Beschreibung
Der Mehrfachempfänger wird mit einem Namen und einem Callback initialisiert. Anschließend können mit
add_slot()mehrere Empfangsmuster eingerichtet werden.Bemerkung
Der Mehrfachempfänger erzeugt für jedes Empfangsmuster einen eigenen Empfänger. Passt eine Nachricht zu mehr als einem Empfangsmuster, wird das Callback für die Nachricht auch mehr als einmal aufgerufen.
Der Mehrfachempfänger muss mit dem Nachrichtensystem verknüpft werden, damit er funktioniert. Dazu wird die Methode
activate()aufgerufen.Siehe auch:
Listener,add_slot(),activate()- activate(message_bus)¶
Verknüpft den Mehrfachempfänger mit dem Nachrichtensystem.
- deactivate(message_bus)¶
Löst die Verbindung des Mehrfachempfängers vom Nachrichtensystem.
- property listeners¶
Gibt eine Sequenz mit allen zur Zeit erzeugten Empfängern zurück.
- property name¶
Gibt den Namen des Empfängers zurück.
- remove_slot(slot)¶
Entfernt ein Empfangsmuster.
Bemerkung
Es muss die selbe Referenz auf das Empfangsmuster übergeben werden, wie an
add_slot()übergeben wurde.
- property slots¶
Gibt eine Sequenz mit allen eingerichteten Empfangsmustern zurück.