上一主题: 案例研究 17:内置功能

下一主题: 案例研究 19:基于文件的数据源的适配器向导

案例研究 18:注册

业务逻辑通常在保持在计算期间使用度量标准资源结构的映射的情况下写入。 由于资源结构随着时间会发生更改,因此在资源结构发生更改时,此类业务逻辑需要在映射中更新结构。

在资源结构发生更改时会调用 OnRegistration 方法,因为该方法负责管理注册中与这些更改相关的引擎行为,并由于资源结构更改而组群。 为每个资源结构更改调用此方法可使其成为更新上面提及的映射的一个方便位置。 但是,填充映射与注册过程无关。 这意味着填充映射降低了 OnRegistration 函数的性能。 这在运行时并不重要,因为通常它不会经常发生。 但是,在引擎的基础架构处理过程期间也调用了 OnRegistration 方法,在此期间,系统会确定资源结构更改是否与实例负责的每个特定度量标准的注册有关。 在此过程中,即使结构更改与当前度量标准无关,仍会为资源结构中的每个更改调用 OnRegistration 方法。 这意味着每个度量标准可能会多次调用此方法。

如果在 OnRegistration 方法中实施此类逻辑,在运行时期间性能上的小幅度降低可能会变为在基础架构处理期间性能上的大幅度降低。

要解决此问题,可通过以下两种方式完成在资源结构发生更改时需要运行的填充映射或任何其他初始化任务(但与注册无关):

使用 dispatcher 对象中的 IsRunTimeMode 属性。

此属性允许用户查明当前运行是否是计算运行,并将与注册无关的逻辑包含在“if”语句中,这将确保此逻辑仅在运行时期间运行。

在下列示例中,标记为蓝色的部分为与注册相关且始终需要运行的业务逻辑的部分。 标记为绿色的部分与注册无关,并且可以包含在新的“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

可按如下所示更改来改进该代码:

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

使用 OnResourceStructureChanged 方法。

此方法在 OnRegistration 方法后运行才能提供与原始方法相同的功能,但它仅在运行时期间运行。 在基础架构处理期间未调用此方法,因此性能并未受损。

在下面示例中,标记为蓝色的部分为与注册相关且需要保持在 OnRegistration 方法中的业务逻辑的部分。 标记为绿色的部分与注册无关,并且可以放入新函数中。

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

可按如下所示更改来改进该代码:

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