Argomento precedente: Case study 17: funzionalità integrataArgomento successivo: Case study 19: procedura guidata di configurazione dell'adapter per origine dati basata su file


Case study 18: registrazione

La business logic è spesso scritta in modo da conservare una mappa della struttura della risorsa di metrica per l'uso durante i calcoli. Poiché la struttura della risorsa cambia nel tempo, la business logic deve aggiornare la struttura nella mappa quando la struttura della risorsa cambia.

Il metodo OnRegistration viene chiamato quando la struttura della risorsa subisce modifiche, poiché è responsabile della gestione del comportamento del motore associato alle modifiche nelle registrazioni e nel raggruppamento dovute a modifiche alla struttura della risorsa. Il fatto che questo metodo viene chiamato per ogni modifica della struttura della risorsa lo rende un passaggio comodo per aggiornare la mappa precedentemente citata. Tuttavia, la compilazione della mappa non è pertinente al processo di registrazione. Questo significa che la compilazione della mappa riduce le prestazioni della funzione OnRegistration. Non è importante durante il runtime, perché non si verifica di frequente. Tuttavia, il metodo OnRegistration è invocato anche nel processo di elaborazione dell'infrastruttura da parte del motore, durante il quale il sistema calcola se le modifiche alla struttura della risorsa sono pertinenti alla registrazione di ciascuna metrica specifica di cui l'istanza è responsabile. Durante questo processo, il metodo OnRegistration viene invocato per ogni modifica nella struttura della risorsa, anche se la modifica alla struttura non è pertinente alla metrica corrente. Ciò significa che il metodo può essere invocato varie volte per metrica.

Se questa logica viene implementata nel metodo OnRegistration, una lieve riduzione delle prestazioni in fase di runtime potrebbe diventare una riduzione delle prestazioni molto significativa durante l'elaborazione dell'infrastruttura.

Per risolvere questo problema, la compilazione delle mappe o di qualsiasi altro processo di inizializzazione che deve essere eseguito quando si verifica una modifica nella struttura della risorsa, ma non pertinente alla registrazione, può essere effettuata in due modi:

Utilizzando la proprietà IsRunTimeMode dell'oggetto dispatcher.

Questa proprietà consente all'utente di determinare se l'esecuzione corrente è un calcolo eseguito o meno, nonché di racchiudere la logica non pertinente alla registrazione in un'istruzione if che garantisce l'esecuzione solo durante il runtime.

Nell'esempio riportato di seguito, la parte contrassegnata in blu è la parte della business logic pertinente alla registrazione e deve essere sempre eseguita. La parte contrassegnata in verde non è pertinente alla registrazione e può essere racchiusa nella nuova istruzione 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)
     Per ogni risorsa in ThisResourceMap
          Risorsa GlobalResourceVector.Add
     Avanti
End Sub

È possibile migliorare questo codice modificandolo nel modo seguente:

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)
          Per ogni risorsa in ThisResourceMap
               Risorsa GlobalResourceVector.Add
          Avanti
     End If
End Sub

Utilizzo del metodo OnResourceStructureChanged.

Questo metodo viene eseguito subito dopo il metodo OnRegistration e fornisce la stessa funzionalità del metodo originale, ma viene eseguito solo durante il runtime. Questo metodo non è invocato durante l'elaborazione dell'infrastruttura e, pertanto, le prestazioni non sono compromesse.

Nell'esempio riportato di seguito, la parte contrassegnata in blu è la parte della business logic pertinente alla registrazione e deve restare nel metodo OnRegistration. La parte contrassegnata in verde non è pertinente alla registrazione e può essere inserita nella nuova funzione.

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)
     Per ogni risorsa in ThisResourceMap
          Risorsa GlobalResourceVector.Add
     Avanti
End Sub

È possibile migliorare questo codice modificandolo nel modo seguente:

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)
     Per ogni risorsa in ThisResourceMap
          Risorsa GlobalResourceVector.Add
     Avanti
End Sub