Tema anterior: Caso práctico 12: Uso de la lógica de contador para calcular el número de erroresTema siguiente: Caso práctico 14: Tratamiento del reloj de acumulación de tiempo


Caso práctico 13: Tratamiento de un grupo de componente dinámico

A menudo, es necesario almacenar valores para un grupo de recursos en los que los miembros de este grupo pueden ser dinámicos y cambiar durante el período de cálculo. En el cálculo del ejemplo de requisito siguiente, es necesario realizar un cálculo intermedio en cada uno de los recursos para alcanzar el resultado global final.

A continuación, se presentan unos cuantos ejemplos:

Ejemplo:

Para el siguiente requisito de cálculo:

Calcule el porcentaje de disponibilidad de un sistema que se compone de un clúster de servidores. El sistema se considera que está disponible solamente cuando todos los servidores subyacentes están disponibles.

El diseño de la solución se implementará de la siguiente manera:

Los recursos en clúster subyacentes evalúan la disponibilidad del sistema. En este caso, es necesario gestionar y almacenar el estado de todos los recursos agrupados en clúster para evaluar el estado del sistema en cada momento.

Para ello, es preciso que la fórmula tenga una asignación (la asignación ServerAvailabilityIndicators en el código de ejemplo siguiente) que cuente con una entrada para cada uno de los recursos controlados. Como todos los objetos de asignación necesitan un campo clave para referenciar el valor asociado, para esta asignación la clave será el indicador de recurso (que es el ID del recurso) y el valor, el estado del componente. Cuando el estado de un componente cambia, la entrada relevante de dicha asignación debería cambiarse. Con cada evento de disponibilidad, la fórmula actualizará el estado del recurso relevante en la asignación y volverá a evaluar el estado del sistema como corresponda.

Dado que los recursos controlados pueden cambiar (algunos podrían eliminarse y otros podrían agregarse durante el período de cálculo), hay que gestionar esto dentro de la fórmula; para ello, se debe agregar una función que identifique el cambio y actualizar la asignación del componente controlado agregando una nueva entrada para un nuevo componente o suprimiendo una entrada si se eliminó un componente.

OnRegistration es el controlador de eventos que gestiona un evento de registro que se activa cuando se produce un cambio en los recursos controlados. Dicho cambio puede ocurrir como resultado de la confirmación de un recurso (o conjunto de cambios), que puede provocar cambios en los recursos incluidos en el cálculo, según el método de registro de la fórmula.

Durante cada registro es necesario actualizar la asignación que conserva los estados de los recursos con los cambios obligatorios. Esto quiere decir que hay que comparar la asignación utilizada para conservar los estados del recurso con la asignación que contiene los recursos en el momento de ejecutar el registro (basado en el método de registro), e incluir todos los recursos que se agregaron o suprimir los recursos que se eliminaron.

El procedimiento de OnRegistration debe, por tanto, ejecutar una función que compara los recursos controlados con los nuevos recursos adjudicados para estructurar los recursos controlados como corresponda.

El objeto de contexto tiene un conjunto de métodos que se asemejan a los métodos de registro. Estos devuelven una asignación con todos los recursos que son parte de los recursos según el método de registro.

En el ejemplo siguiente el registro de la fórmula es ByContractParty y, por consiguiente, Context.ResourcesOfContractParty utiliza el mismo método. Devuelve una asignación con todos los recursos que forman parte de este conjunto en el momento del registro.

Para comparar las dos asignaciones, es necesario iterar las asignaciones simultáneamente. Para iterar las asignaciones se utiliza la declaración "For each". Esta declaración permite procesar una iteración en los valores de una asignación y, por lo tanto, se necesita otra asignación como duplicado de la asignación de estados para poder procesar una iteración en los recursos y no en los valores de estado. Esta declaración itera los valores de una asignación y no sus claves. Por consiguiente, se necesita una asignación extra que tenga tanto los ID como una clave y un valor. Además, hay que mantener la asignación del duplicado para reflejar continuamente la asignación de estados, y que así se tenga siempre el mismo conjunto de recursos. Esto significa que cuando la asignación de estados se actualiza, la asignación del duplicado se deberá actualizar también.

La siguiente figura muestra el concepto de las asignaciones de duplicación.

Ejemplo:

Dim ServerAvailabilityIndicators
Dim MonitoredServers
Set ServerAvailabilityIndicators=CreateObject("SlalomMap.Map")
Set MonitoredServers=CreateObject("SlalomMap.Map")

Sub OnRegistration(dispatcher)
   dispatcher.RegisterByContractParty "OnAvailabilityEvent",_
      "Availability Event", "SAP Production Server"
   Dim AllocatedServers
   Set AllocatedServers = Context.ResourcesOfContractParty("SAP Production Server")
   UpdateMonitoredServers AllocatedServers
End Sub

Sub UpdateMonitoredServers(allocatedServers)
   Dim Server
   For Each Server In allocatedServers
      If Not MonitoredServers.Exist(Server) Then
         MonitoredServers(Server) = Server
         ServerAvailabilityIndicators(Server)=True
      End If
   Next

   For Each Server In MonitoredServers
      If Not allocatedServers.Exist(Server) Then
         MonitoredServers.Erase Server
         ServerAvailabilityIndicators.Erase Server
      End If
   Next
End Sub

Ejemplo:

La siguiente función prueba cómo la asignación del duplicado se usa para procesar una iteración en la asignación de estados cuando es necesario evaluar todo el sistema según el estado de cada uno de los recursos controlados.

En este ejemplo, se considera que el sistema está disponible si todos los recursos están disponibles. Un solo componente inactivo ya es suficiente para considerar el sistema inactivo:

Function SystemAvailability
   Dim Server
   For Each Server In MonitoredServers
      If ServerAvailabilityIndicators(Server) = DOWN then
         SystemAvailability=DOWN
         Exit Function
      End if
   Next
End Function

En el siguiente ejemplo de patrón de diseño se describe un ejemplo de lógica de negocios completa con tratamiento de recursos dinámicos.