GlobalObjects
Lade ...
Suche ...
Keine Treffer
Persistente Objekte beobachten / benachrichtigen

Grundsätzliches

Um über Änderungen und Zustände in der Objektdatenbank informiert zu sein, steht ein umfangreiches Benachrichtigungssystem in GlobalObjects zur Verfügung. Damit kann unter anderem die Konsistenz einzelner Objekte für mehreren Instanzen im Mehrbenutzerbtrieb gewährleistet werden.

Man kann einzelne Objekte, Gruppen von Objekten in Containern und ganze AllSets beobachten und sich bei Änderungen benachrichtigen lassen. Es können Operationen in der Objektdatenbank die länger dauern, beobachtet werden und man kann sich über den Fortschritt benachrichtigen lassen. Zusätzlich ist es möglich, das Öffnen bzw. Schließen einer Objektdatenbank anderer Clients zu beobachten.

Siehe auch

Wer oder was wird benachrichtigt

Es muss zum Beobachten ein Objekt, abgeleitet von glo::CallBack, an die jeweilige Beobachtungsmethode übergeben werden. Damit die Benachrichtigung bearbeitet wird, muss die virtuelle Methode glo::CallBack::notify(glo::NotifyNote & rNote) für die Auswertung der glo::NotifyNote überschrieben werden.

Siehe auch
Beispielklasse abgeleitet von glo::CallBack

Grundsätzlich wird bei einer Beobachtung auch die beobachtende Instanz, welche die Änderung bzw. das Ereignis selbst ausgelöst hat, benachrichtigt.

Zu beachten
Die Beobachtungsfunktionalität liefert auch im Einzelbenutzerbetrieb valide Ergebnisse (es kann wie im Mehrbenutzerbetrieb eine Beobachtung gesetzt werden).



Ein persistentes Objekt beobachten

Ein einzelnes Objekt kann auf vielfältige Weise zur Beobachtung an die Objektdatenbank übergeben werden. Dieses kann wahlweise über glo::Persistent::setWatch (...), glo::TOndemand::setWatch (...) oder glo::Base::setWatchObject (...) initiiert werden.

Wenn Objekte einer persistenten Klasse 'X', abgeleitet von glo::Persistent, sich selbst beobachten sollen (ggf. um sich bei einer Änderung einer anderen Instanz durch glo::Persistent::refresh() die aktuellen Attributdaten aus der Datenbank einzulesen), reicht es in 'X' die von glo::CallBack geerbte Methode glo::CallBack::notify( glo::NotifyNote & rNote ) zu überschreiben ( glo::Persistent ist von glo::CallBack abgeleitet und kann somit auch benachrichtigt werden).

Es empfiehlt sich, bei der überschriebenen Notify-Methode in der Klasse 'X' den Bezeichner "override" zu verwenden.

Beispiel:

...
virtual void notify( glo::NotifyNote & rNote ) override;
...
Objektinfo des WatchNotifyManager für die beobachtende Instanz. Siehe ausführliche Beschreibung im ...
Definition GloNotifyNote.h:73

Um die Beobachtung mit sich selbst als glo::NotifyNote empfangendes Objekt zu initiieren, wird glo::Persistent::setWatch (…) und glo::Persistent::unsetWatch (…) ohne einen Zeiger auf ein glo::CallBack als Parameter aufgerufen.

Beispiel:

...
int iErr = myPersXObject->setWatch( glo::WNM_WRITE | glo::WNM_DELETE, glo::DM_FLAT );
...
@ DM_FLAT
Definition GloTypes.h:276
const TdWatchNotifyMode WNM_WRITE
Definition GloTypes.h:586
const TdWatchNotifyMode WNM_DELETE
Definition GloTypes.h:614



Eine weitere Möglichkeit besteht, indem eine glo::TPointerList, ein glo::TPointerSet, eine glo::TOndemandList oder ein glo::TOndemandSet genutzt wird. In diesen Containern kann eine Beobachtung gesetzt werden. Jedes Objekt, welches man in den Containern einfügt wird automatisch mit dem Beobachtungsmodus des Containers beobachtet, bzw. es wird die Beobachtung beendet wenn es aus dem Container entfernt wird.

Siehe auch
Mehrere persistente Objekte beobachten
Zu beachten
Ggf. werden referenzierte Objekte mitbeobachtet, wenn über dass Schlüsselwort dependent (siehe auch in Tabelle Glo-Datentypen in Spalte TypInfo) eingestellt und der Beobachtungstiefenmodus glo::EnDeepMode dementsprechend ist. Dieses gilt auch für die folgenden Erläuterungen wenn mehrere Objekte gleichzeitig beobachtet werden.
Achtung
Eine Beobachtung muss mit den gleichen Parametern beendet werden. Das kann wiederum wahlweise über glo::Persistent::unsetWatch (...), glo::TOndemand::unsetWatch (...) oder glo::Base::unsetWatchObject (...) geschehen.



Mehrere persistente Objekte beobachten

Eine Gruppen von persistenten Objekten kann mit Übergabe einer Unterklasse von glo::BaseLot an Methode glo::Base::setWatchLot (...) bzw. den direkten Aufruf von glo::BaseLot::setWatch(glo::TdWatchNotifyMode, glo::EnDeepMode, glo::CallBack*) bzw. glo::BaseLot::setWatch(const glo::WatchSpecification&) beobachtet werden (glo::BaseLot ist die Oberklasse von glo::TOndemandList, glo::TOndemandSet, glo::TPointerList und glo::TPointerSet).

Achtung
Die Beobachtung muss mit den gleichen Parametern aufgehoben werden. Das kann wiederum wahlweise über glo::Base::unsetWatchLot (...) oder glo::BaseLot::unsetWatch(glo::TdWatchNotifyMode, glo::EnDeepMode, glo::CallBack*) bzw. glo::BaseLot::unsetWatch(const glo::WatchSpecification&) geschehen.



Benachrichtigung für beobachtete Objekte auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Enthält keine Information.
glo::NotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ).
glo::NotifyNote::m_strClientName Der Name des auslösenden Clients.
glo::NotifyNote::m_ObjID Die glo::ObjID des Objektes, auf dem die Aktion glo::NotifyNote::m_ulNotifyMode ausgeführt wurde.
glo::NotifyNote::m_uiInfo Enthält keine Information.
glo::NotifyNote::m_uiInfo2 Enthält keine Information.
glo::NotifyNote::m_strInfo Enthält keine Information.
glo::NotifyNote::m_strInfo2 Enthält keine Information.



Einen glo::TAllSet beobachten

In einem glo::TAllSet (alle persistenten Objekte eines Typs in der Objektdatenbank) können die Objekt eingeschränkt nur flach beobachtet werden (es wird kein glo::EnDeepMode übergeben). Zusätzlich gibt es die Möglichkeit, dass sich die aufrufende Instanz benachrichtigen lässt, wenn ein neues Objekt gespeichert, also in den glo::TAllSet eingefügt wird. Dieses kann wahlweise über glo::TAllSet::setWatch(glo::TdWatchNotifyMode, glo::CallBack*) oder glo::Base::setWatchClass (...) initiiert werden.

Achtung
Die Beobachtung muss mit den gleichen Parametern aufgehoben werden. Das kann wiederum wahlweise über glo::TAllSet::unsetWatch(glo::TdWatchNotifyMode, glo::CallBack*) oder glo::Base::unsetWatchClass (...) geschehen.



Benachrichtigung für beobachteten glo::TAllSet auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Enthält keine Information.
glo::NotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ).
glo::NotifyNote::m_strClientName Der Name des auslösenden Clients.
glo::NotifyNote::m_ObjID Die glo::ObjID des Objektes, auf dem die Aktion glo::NotifyNote::m_ulNotifyMode ausgeführt wurde.
glo::NotifyNote::m_uiInfo Enthält keine Information.
glo::NotifyNote::m_uiInfo2 Enthält keine Information.
glo::NotifyNote::m_strInfo Enthält keine Information.
glo::NotifyNote::m_strInfo2 Enthält keine Information.



Den Verbindungsauf- bzw. -abbau an eine GloServer beobachten

Ist man mit einem GloServer verbunden, kann beobachtet werden, welche Clients sich mit diesem GloServer verbinden. Dieses wird über die Methode glo::Base::setWatchClient (...) mit den Parametern glo::WNM_CLIENT_CONNECTSERVER bzw. glo::WNM_CLIENT_DISCONNECTSERVER initiiert.

Achtung
Die Beobachtung muss mit den gleichen Parametern über glo::Base::unsetWatchClient (...) aufgehoben werden.



Benachrichtigung für beobachteten Verbindungsauf- bzw. -abbau an einen GloServer auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Der SOCKET des auslösenden Clients.
glo::NotifyNote::m_uiCommunicatorID Ist 0, da diese erst mit dem Öffnen einer Objektdatenbank vergeben wird.
glo::NotifyNote::m_strClientName Enthält keine Information, da die Clientbezeichnung erst mit dem Öffnen einer Objektdatenbank vergeben wird.
glo::NotifyNote::m_ObjID Enthält keine Information.
glo::NotifyNote::m_uiInfo Enthält keine Information.
glo::NotifyNote::m_uiInfo2 Enthält keine Information.
glo::NotifyNote::m_strInfo Enthält keine Information.
glo::NotifyNote::m_strInfo2 IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients.



Das Öffnen und Schließen einer Objektdatenbank beobachten

Ist man mit einem GloServer verbunden, kann beobachtet werden, welche Clients welche Objektdatenbank öffnen und schließen. Dieses wird über die Methode glo::Base::setWatchClient (...) mit den Parametern glo::WNM_CLIENT_OPENBASE bzw. glo::WNM_CLIENT_CLOSEBASE initiiert.

Achtung
Die Beobachtung muss mit den gleichen Parametern über glo::Base::unsetWatchClient (...) aufgehoben werden.

Benachrichtigung für beobachtetes Öffnen und Schließen einer Objektdatenbank auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Der SOCKET des auslösenden Clients.
glo::NotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ).
glo::NotifyNote::m_strClientName Der Name des auslösenden Clients.
glo::NotifyNote::m_ObjID Enthält keine Information.
glo::NotifyNote::m_uiInfo Enthält keine Information.
glo::NotifyNote::m_uiInfo2 Enthält keine Information.
glo::NotifyNote::m_strInfo Bezeichnung der geöffneten/geschlossenen Objektdatenbank.
glo::NotifyNote::m_strInfo2 IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients.



Über Lesen und Schreiben der Indexe benachrichtigen lassen

Das Einlesen und Schreiben der Indexe kann etwas länger dauern. Wird eine Objektdatenbank geöffnet, wird der Index (wenn nicht schon geschehen) eingelesen. Damit der Anwender nicht das Gefühl bekommt, dass die Anwendung "eingefroren ist", kann sich die Applikation über den Fortschritt des Einlesens informieren lassen und dieses dem Anwender anzeigen.
Um sich über den Fortschritt des Einlesens informieren zu lassen, muss den Aufrufen von glo::Base::open (...) und glo::Base::close (...), bzw. glo::Base::openBase (...) und glo::Base::closeBase (...) lediglich ein entsprechendes glo::CallBack -Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht extra gesetzt bzw. aufgehoben werden, die Übergabe des glo::CallBack -Objekts reicht aus.

Benachrichtigung des Lesens und Schreibens der Indexe auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Enthält keine Information.
glo::NotifyNote::m_uiCommunicatorID Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ).
glo::NotifyNote::m_strClientName Der Name des auslösenden Clients.
glo::NotifyNote::m_ObjID Der Index der KlassenID in der glo::ObjID wird aktuell gelesen bzw. geschrieben. Alle Wechsel dieses Wertes ergeben die Anzahl der Aktionen aus glo::NotifyNote::m_uiInfo2.
glo::NotifyNote::m_uiInfo Der prozentuale Anteil des schon eingelesenen bzw. geschriebenen aktuellen Indexes.
glo::NotifyNote::m_uiInfo2 Anzahl der Indexe, die gelesen, bzw. geschrieben werden.
glo::NotifyNote::m_strInfo Bezeichnung des eingelesenen bzw. geschriebenen aktuellen Indexes.
glo::NotifyNote::m_strInfo2 Enthält keine Information.



Über das Neuindizieren benachrichtigen lassen

Ist man mit einer Objektdatenbank verbunden, können die Indexe neu indiziert werden, z.B. wenn diese 'korrupt' sind. Dieser Vorgang kann je nach Objektmenge länger dauern. Auch hier kann der Fortschritt angezeigt werden. Dafür muss den Methoden glo::Base::reindexBase(const std::string&, glo::CallBack* ) bzw. glo::Base::reindexBase(glo::CallBack*) lediglich ein entsprechendes glo::CallBack-Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht extra gesetzt bzw. aufgehoben werden, die Übergabe des glo::CallBack -Objekts reicht aus.

Über das Komprimieren benachrichtigen lassen

Ist man mit einer Objektdatenbank verbunden, können die Tabellen komprimiert werden, es werden die Einträge der gelöschten Objekte aus den Tabellen entfernt. Da es zum Index der vorhandenen Objekte auch einen Index der gelöschten Objekte gibt, kann letzterer Index entsorgt werden, wenn die gelöschten Einträge in den Tabellen entfernt sind. Dieser Vorgang kann je nach Objektmenge länger dauern. Auch hier kann der Fortschritt angezeigt werden. Dafür muss den Methoden glo::Base::compressBase(const std::string&, glo::CallBack*) bzw. glo::Base::compressBase(glo::CallBack*) lediglich ein entsprechendes glo::CallBack-Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht extra gesetzt bzw. aufgehoben werden, die Übergabe des glo::CallBack -Objekts reicht aus.

Benachrichtigung einer Fortschrittsanzeige auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion ausgeführt wirde.
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Enthält keine Information.
glo::NotifyNote::m_uiCommunicatorID Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ).
glo::NotifyNote::m_strClientName Der Name des auslösenden Clients.
glo::NotifyNote::m_ObjID Die KlassenID in der glo::ObjID, deren Tabelle gerade verarbeitet wird. Alle Wechsel dieses Wertes ergeben die Anzahl der Aktionen aus glo::NotifyNote::m_uiInfo2.
glo::NotifyNote::m_uiInfo Der prozentuale Anteil der abgeschlossenen Aktionen.
glo::NotifyNote::m_uiInfo2 Anzahl der Aktionen.
glo::NotifyNote::m_strInfo Die Bezeichnung der Tabelle, welche gerade verarbeitet wird.
glo::NotifyNote::m_strInfo2 Enthält keine Information.



Über Glo-Server Verbindungsabbruch benachrichtigen lassen

Ist man mit einem GloServer verbunden, kann eine Benachrichtigung initiieren, wenn es zu einen Verbindungsabbruch zu dem GloServer kommt. Dieses wird über die Methode glo::Base::connect (…), glo::Base::reconnect (…) oder glo::Base::setWatchServer (…) initiiert.

Benachrichtigung für beobachteten Verbindungsabbruch eines GloServer auswerten

Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:

glo::NotifNote Werte
glo::NotifNote Attribut Inhalt
glo::NotifyNote::m_ulNotifyMode Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
glo::NotifyNote::m_ipCallBack Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen.
glo::NotifyNote::m_nSocket Enthält keine Information.
glo::NotifyNote::m_uiCommunicatorID Enthält keine Information (die eigene CommunicatorID ist durch den Abbruch verloren).
glo::NotifyNote::m_strClientName Enthält keine Information, es gibt keinen auslösenden Clients.
glo::NotifyNote::m_ObjID Enthält keine Information.
glo::NotifyNote::m_uiInfo Enthält keine Information.
glo::NotifyNote::m_uiInfo2 Die Port-Nummer des GloServer, zu dem die Verbindung abgebrochen ist.
glo::NotifyNote::m_strInfo Enthält keine Information.
glo::NotifyNote::m_strInfo2 IP-Adresse (ggf. in einen Namen aufgelöst) des GloServer, zu dem die Verbindung abgebrochen ist.