Tópico anterior: Estudo de caso 17: Funcionalidade integrada

Próximo tópico: Caso de estudo 19: assistente de conector para fonte de dados com base em arquivo

Estudo de caso 18: Registro

A lógica de negócios é muitas vezes criada de modo a manter um mapeamento da estrutura do recurso da métrica para uso em cálculos. Considerando que a estrutura do recurso muda com o tempo, tal lógica de negócios precisa atualizar a estrutura no mapeamento mediante alterações na estrutura do recurso.

O método OnRegistration é chamado quando a estrutura do recurso é alterada, uma vez que é responsável por gerenciar o comportamento do mecanismo associado às alterações nos registros e agrupamentos decorrentes de mudanças na estrutura do recurso. O fato de esse método ser chamado a cada alteração na estrutura do recurso o torna conveniente para atualizar o mapeamento mencionado acima. No entanto, a criação do mapeamento não é relevante para o processo de registro. Isso significa que criar o mapeamento prejudica o desempenho da função OnRegistration. Isso não é importante durante o tempo de execução, uma vez que não acontece com muita frequência. Contudo, o método OnRegistration também é chamado durante o processamento da infraestrutura pelo mecanismo. Enquanto isso, o sistema identifica se as alterações na estrutura do recurso são relevantes para o registro de cada métrica específica pela qual a instância é responsável. Durante esse processo, o método OnRegistration é chamado a cada alteração na estrutura do recurso, mesmo se ela não for relevante à métrica atual. Isso significa que o método pode ser chamado muitas vezes por métrica.

Se essa lógica for implementada no método OnRegistration, uma pequena redução no desempenho em tempo de execução pode se tornar algo significativo durante o processamento da infraestrutura.

Para resolver esse problema, a criação de mapeamentos ou qualquer outra inicialização que precise ser executada quando uma alteração na estrutura do recurso ocorrer, mas não for relevante ao registro, pode ser feita de duas maneiras:

Usando a propriedade IsRunTimeMode no objeto de dispatcher.

Ela permite ao usuário identificar se a execução atual é ou não de cálculo e embutir a lógica que não for relevante ao registro em uma instrução IF, garantindo, assim, que a execução ocorra apenas em tempo de execução.

No exemplo abaixo, o que está marcado em azul é a parte da lógica de negócios relevante ao registro e que precisa estar sempre em execução. O que está marcado em verde não é relevante ao registro e pode ser embutido na nova instrução 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)
     Para cada recurso em ThisResourceMap
          GlobalResourceVector.Add resource
     Próximo
End Sub

Esse código pode ser aprimorado da seguinte maneira:

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)
          Para cada recurso em ThisResourceMap
               GlobalResourceVector.Add resource
          Próximo
     End If
End Sub

Usando o método OnResourceStructureChanged.

Este método é executado logo após OnRegistration e, portanto, oferece a mesma funcionalidade que a metodologia original. Contudo, é executado apenas em tempo de execução. Esse método não é chamado durante o processamento da infraestrutura e, assim, o desempenho não é afetado.

No exemplo abaixo, o que está marcado em azul é a parte da lógica de negócios relevante ao registro e que precisa permanecer no método OnRegistration. O que está marcado em verde não é relevante ao registro e pode ser colocado na nova função.

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)
     Para cada recurso em ThisResourceMap
          GlobalResourceVector.Add resource
     Próximo
End Sub

Esse código pode ser aprimorado da seguinte maneira:

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)
     Para cada recurso em ThisResourceMap
          GlobalResourceVector.Add resource
     Próximo
End Sub