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:
En estos ejemplos, los sitios son recursos que tienen incidentes asociados con ellos.
Un servidor es un recurso para el cual hay que evaluar el porcentaje de disponibilidad.
En este caso, un tipo de transacción es un recurso que tiene eventos de error asociados. Para cada tipo de transacción, se guarda un contador de error como resultado intermedio y se cuentan el número de tipos de transacciones diferentes que tuvieron más de X errores.

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.
|
Copyright © 2013 CA.
Todos los derechos reservados.
|
|