Vorheriges Thema: Fallstudie 17: Integrierte FunktionalitätNächstes Thema: Fallstudie 19: Adapterassistent für dateibasierte Datenquelle


Fallstudie 18: Registrierung

Business-Logik wird oft so geschrieben, dass eine Übersicht der Ressourcenstruktur der Metrik für Berechnungen beibehalten wird. Da die Ressourcenstruktur sich im Laufe der Zeit ändert, muss die Business-Logik die Struktur in der Übersicht aktualisieren.

Die Methode "OnRegistration" wird aufgerufen, wenn die Ressourcenstruktur sich ändert, da sie dafür verantwortlich ist, das Engine-Verhalten zu verwalten, das mit den Änderungen in den Registrierungen und dem Clustering aufgrund von Ressourcenstrukturänderungen verknüpft ist. Dadurch, dass diese Methode für jede Ressourcenstrukturänderung aufgerufen wird, ist sie geeignet, um die oben erwähnte Übersicht zu aktualisieren. Das Befüllen der Übersicht ist jedoch nicht für den Registrierungsprozess relevant. Das bedeutet, dass beim Befüllen der Übersicht die Leistung der Funktion "OnRegistration" beeinträchtigt wird. Dies spielt während der Laufzeit keine Rolle, da es normalerweise nicht sehr oft geschieht. Allerdings wird die Methode "OnRegistration" auch während des Infrastrukturverarbeitungsprozesses der Engine aufgerufen. Während des Prozesses ermittelt das System, ob Ressourcenstrukturänderungen für die Registrierung jeder spezifischen Metrik relevant sind, für die die Instanz verantwortlich ist. Während dieses Prozesses wird die Methode "OnRegistration" für jede Änderung in der Ressourcenstruktur aufgerufen, auch wenn die Strukturänderung für die aktuelle Metrik nicht relevant ist. Das heißt, dass die Methode pro Metrik oft aufgerufen wird.

Wenn eine derartige Logik in der Methode "OnRegistration" implementiert wird, kann aus einer geringen Leistungsverschlechterung während der Laufzeit eine erhebliche Leistungsverschlechterung während der Infrastrukturverarbeitung werden.

Um dieses Problem zu lösen, haben Sie zwei Möglichkeiten, Übersichten zu befüllen oder andere Initialisierungen durchzuführen (bei einer Änderung in der Ressourcenstruktur, die nicht für die Registrierung relevant ist):

Verwenden der Eigenschaft "IsRunTimeMode" im Dispatcher-Objekt

Diese Eigenschaft erlaubt es dem Anwender, zu ermitteln, ob es sich bei der aktuellen Ausführung um eine Berechnung handelt, und eine Logik, die nicht relevant für die Registrierung ist, in einer IF-Anweisung einzuschließen. Dies stellt sicher, dass sie nur während der Laufzeit ausgeführt wird.

Im unteren Beispiel ist der blau markierte Teil der Business-Logik der Teil, der relevant für die Registrierung ist und immer ausgeführt werden muss. Der grün markierte Teil ist für die Registrierung nicht relevant und kann in der neuen IF-Anweisung eingeschlossen werden.

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add-Ressource
     Next
End Sub

Dieser Code kann verbessert werden, indem er folgendermaßen geändert wird:

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     If Dispatcher.IsRunTimeMode Then
          Dim ThisResourceMap
          Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
          Dim resource
          ThisResourceMap = Kontext.ResourcesOfResourceGroup(Kontext.ClusterItem)
          For Each resource In ThisResourceMap
               GlobalResourceVector.Add-Ressource
          Next
     End If
End Sub

Verwenden der Methode "OnResourceStructureChanged"

Diese Methode wird direkt nach der Methode "OnRegistration" ausgeführt und weist dieselbe Funktionalität wie die ursprüngliche Methodik auf. Sie wird jedoch nur während der Laufzeit ausgeführt. Diese Methode wird nicht während der Infrastrukturverarbeitung aufgerufen, um die Leistung nicht zu beeinträchtigen.

Im unteren Beispiel ist der blau markierte Teil der Business-Logik der Teil, der relevant für die Registrierung ist und in der Methode "OnRegistration" beibehalten werden muss. Der grün markierte Teil ist für die Registrierung nicht relevant und kann in der neuen Funktion platziert werden.

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add-Ressource
     Next
End Sub

Dieser Code kann verbessert werden, indem er folgendermaßen geändert wird:

Sub OnRegistration (dispatcher)
     Dim MyResource
     MyResource = Context.ClusterItem
     Dispatcher.RegisterByResource “OnEvent”, “My Event Type”, MyResource
End Sub

Sub OnResourceStructureChanged(time)
     Dim ThisResourceMap
     Set GlobalResourceVector= CreateObject("SlalomVector.Vector")
     Dim resource
     Set ThisResourceMap = Context.ResourcesOfResourceGroup(Context.ClusterItem)
     For Each resource In ThisResourceMap
          GlobalResourceVector.Add-Ressource
     Next
End Sub