Tema anterior: Caso práctico 17: Funcionalidad incorporadaTema siguiente: Caso práctico 19: Asistente del adaptador para origen de datos basado en archivo


Caso práctico 18: Registro

La lógica de negocios se escribe a menudo de forma que conserva una asignación de la estructura del recurso de la métrica para usarla durante los cálculos. Como la estructura cambia con el tiempo, dicha lógica de negocios tiene que actualizar la estructura en la asignación cuando la estructura del recurso cambia.

El método OnRegistration se convoca cuando la estructura del recurso cambia, ya que es responsable de gestionar cómo debe comportarse el motor con los cambios en los registros y el agrupamiento en clúster provocados por los cambios en la estructura de recursos. El hecho de que este método se convoque para cada cambio de estructura de recurso hace sea un lugar conveniente para actualizar la asignación mencionada anteriormente. Sin embargo, rellenar la asignación no es pertinente para los procesos de registro. Esto significa que, al rellenar la asignación, se degrada el rendimiento de la función OnRegistration. Esto no es importante durante el tiempo de ejecución, ya que no suele suceder muy a menudo. Sin embargo, el método OnRegistration se convoca también durante el proceso de procesamiento de infraestructura del motor, mientras el sistema averigua si los cambios en la estructura de recursos son relevantes para el registro de cada métrica específica de la cual es responsable la instancia. Durante este proceso, el método OnRegistration se convoca para todos los cambios en la estructura de recursos, aunque el cambio de estructura no sea relevante para la métrica actual. Esto significa que el método se puede convocar un gran número de veces por métrica.

Si dicha lógica se implementa en el método OnRegistration, una pequeña degradación del rendimiento durante el tiempo de ejecución podría convertirse en una degradación muy significativa del rendimiento durante el procesamiento de la infraestructura.

Para resolver este problema, las asignaciones de relleno o cualquier otra inicialización que necesite ejecutarse cuando se produce un cambio en la estructura de recursos, que no es relevante para el registro, se pueden llevar a cabo de dos maneras:

Mediante la propiedad IsRunTimeMode en el objeto distribuidor

Esta propiedad permite al usuario averiguar si la ejecución actual es o no una ejecución de cálculo y encerrar la lógica que no sea relevante para el registro en una declaración "if", que asegurará que se ejecutará solamente durante el tiempo de ejecución.

En el ejemplo a continuación, la parte marcada en azul es la parte de la lógica de negocios que es relevante para el registro y siempre tiene que ejecutarse. La parte marcada en verde no es relevante para el registro y se puede encerrar en la nueva declaración "if".

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 resource
     Next
End Sub

Este código se puede mejorar cambiándolo de la siguiente manera:

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 = Context.ResourcesOfResourceGroup(Context.ClusterItem)
          For Each resource In ThisResourceMap
               GlobalResourceVector.Add resource
          Next
     End If
End Sub

Uso del método OnResourceStructureChanged

Este método se ejecuta justo después del método OnRegistration y, de esta manera, ofrece la misma funcionalidad que la metodología original, pero solamente se ejecuta durante el tiempo de ejecución. Este método no se convoca durante el procesamiento de infraestructuras y por ello el rendimiento no se ve perjudicado.

En el ejemplo a continuación, la parte marcada en azul es la parte de la lógica de negocios que es relevante para el registro y siempre tiene que estar en el método OnRegistration. La parte marcada en verde no es relevante para el registro y se puede colocar en la nueva función.

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 resource
     Next
End Sub

Este código se puede mejorar cambiándolo de la siguiente manera:

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 resource
     Next
End Sub