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
|
Copyright © 2013 CA.
Alle Rechte vorbehalten.
|
|