Ejemplo: Implementación de alertas de BPM

Este ejemplo muestra cómo utilizar las API REST de alertas de BPM para crear un panel de control en la consola de administración de procesos que se visualice cuando el número de instancias de proceso o tareas desencadena una alerta.

El ejemplo consta de un objeto de negocio que debe contener la información de alerta, un servicio de integración para llamar a las API JavaScript para recuperar la información de alerta y una interfaz de usuario para visualizar las alertas en Process Admin Console. El panel de control es similar a la captura de pantalla siguiente:

El panel de control Mis alertas visualizado en Process Admin Console

Este ejemplo es simplemente un modo de informar a los administradores de cuándo el número de instancias de proceso o tareas cae por debajo, alcanza o supera un valor de umbral especificado. Por ejemplo, puede utilizar las API para crear correos electrónicos que se envíen a los administradores o crear una página web a la que los administradores pueden acceder fuera de la consola de administración de procesos.
Consejo: para obtener una presentación alternativa, también puede consultar el ejemplo de alertas de BPM disponible en la página de inicio Use de IBM Business Process Manager Developer Center. Los pasos de este ejemplo muestran cómo crear la mayor parte del ejemplo mencionado. En dicho ejemplo hay algunas mejoras, como por ejemplo código y artefactos para el manejo de errores.

Crear el objeto de negocio de alerta

En el ejemplo, el objeto de negocio AlertStatusSummary contiene información sobre las definiciones de alerta que el usuario ve en el panel de control.

El panel de control de ejemplo utiliza una tabla en la que cada fila representa una definición de alerta diferente de una instancia distinta de AlertStatusSummary.

  1. En Process Center, cree la aplicación de proceso Ejemplo de alertas para contener los artefactos de panel de control.
  2. Abra la nueva aplicación de proceso en Process Designer.
  3. Añada el kit de herramientas Paneles de control como dependencia. El panel de control utiliza diversas vistas de coach y otros recursos de este kit de herramientas para gestionar su comportamiento de renovación y para los filtros.
  4. Cree el objeto de negocio AlertStatusSummary.
  5. Establezca su tipo de definición en Tipo de estructura compleja y añádale los parámetros siguientes:
    Nombre de parámetro Descripción
    status(String) Indica si se ha desencadenado una alerta para esta definición de alerta o algún otro estado.
    displayName(String) El nombre de la definición de alerta visible para los usuarios.
    condition(String) La expresión que determina si el valor real del parámetro supervisado supera el valor de umbral.
    currentValue(String) El valor del parámetro supervisado.
    thresholdOperator(String) Indica si el atributo debe ser igual a, menor que o mayor que el valor de umbral para desencadenar la alerta.
    thresholdValue(String) El valor que desencadena la alerta.
    projectDisplayName(String) La aplicación de proceso cuyas condiciones de alerta se están supervisando.
    snapshotDisplayName(String) El nombre visible de la instantánea de aplicación de proceso cuyas condiciones de alerta se están supervisando.
    bpdDisplayName(String) El nombre de la BPD visible para los usuarios.
    instanceStatus (String) Indica si se ha desencadenado una alerta para la instancia de proceso o algún otro estado.
    taskStatus(String) Indica si se ha desencadenado una alerta para la instancia de tarea o algún otro estado.

Creación del servicio de integración

En el ejemplo, el servicio de integración recupera la lista de definiciones de alerta en función de un filtro.

En el ejemplo, el usuario selecciona los filtros mediante la interfaz de usuario siguiente en el panel de control:

El primer filtro corresponde a alertas desencadenadas o a todas las alertas. El segundo filtro corresponde a alertas de instancia de proceso, alertas de tarea o a todas las alertas
El servicio de integración acepta como entrada si el usuario ha seleccionado visualizar alertas de instancia de proceso o alertas de tarea, o ambos tipos de definiciones de alertas. El otro filtro, alertas desencadenadas, se aplica a la salida de este servicio de integración como parte de la definición del servicio de usuario de herencia. Como salida, el servicio de integración crea una lista de objetos de negocio BPMAlertDefinitionStatus. Estos objetos contienen las definiciones de alertas y si se han desencadenado o no.

  1. Cree un servicio de integración denominado Servicio de recuperación de estado de definiciones de alertas.
  2. Añada la siguiente variable de entrada:
    • categoryFilter(String)(List)

    El servicio acepta esta entrada para determinar qué tipo de definiciones de alertas debe recuperar.

  3. Añada la siguiente variable de salida:
    • alertDefinitionsStatus(BPMAlertDefinitionStatus)(List)

    La variable de salida contiene la lista de definiciones de alertas que el servicio ha recuperado en función del tipo de alertas que el usuario desea ver. El tipo BPMAlertDefinitionStatus se encuentra en el kit de herramientas Datos del sistema para dar soporte a alertas de BPM.

    Variables de entrada y salida del servicio de integración

  4. En el diagrama, añada un script de servidor denominado Recuperar alertas. Conecte el suceso de inicio al script de servidor y, a continuación, conecte el script de servidor al suceso de finalización.
    Diagrama resultante
  5. Seleccione el script de servidor y, en su página de propiedades Implementación, añada código que realice lo siguiente:
    • Determinar el filtro que debe aplicarse.
    • Recuperar las definiciones de alertas que coinciden con el filtro de tipo y colocarlas en una lista.
    • Recuperar las definiciones de alerta que han desencadenado una alerta.
    var ids = null;
    
    // si se ha establecido categoryFilter, utilizarlo para obtener las definiciones de alerta
    if(tw.local.categoryFilter != null) {
    	var alertDefinitions = tw.system.getAlertDefinitions(tw.local.categoryFilter, true);
    	ids = new tw.object.listOf.String();
    	for (var i=0; i<alertDefinitions.length; i++) {
    		ids.insertIntoList(i, alertDefinitions[i].id);
    }}
    
    // obtener el estado de las definiciones de alerta recuperadas
    if(ids == null || ids.length > 0) {
    	var alertStatusResponse = tw.system.getAlertDefinitionsStatus(ids, true);
    	tw.local.alertDefinitionsStatus = alertStatusResponse.alertDefinitionStatus;
    }

Crear el servicio de usuario para dar soporte a la interfaz de usuario

El ejemplo utiliza un servicio de usuario de herencia para definir el flujo entre el servicio de integración y la interfaz de usuario definida en un coach.

La exposición de la interfaz de usuario como servicio de administración en Process Admin Console requiere utilizar un servicio de usuario de herencia en lugar de un servicio de usuario del lado de cliente.
  1. Cree un servicio de usuario de herencia denominado Panel de control Mis alertas.
  2. Añada las siguientes variables privadas al servicio de usuario Panel de control Mis alertas:
    Variable privada Valor predeterminado Descripción
    refresh(Boolean) Se establece en true para desencadenar un suceso de límite que llama al servicio de integración para recuperar de nuevo las definiciones de alertas.
    refreshInterval (Integer) 60 El número de segundos entre renovaciones.
    categoryFilter(String)(List) El tipo de filtro a utilizar para recuperar definiciones de alertas si el usuario ha seleccionado alertas de instancia de proceso o alertas de tarea. Los valores válidos son "INSTANCE" o "TASK". Es opcional y, si no tiene un valor, se recuperan ambos tipos de definiciones de alertas.
    alertDefinitionsStatus(BPMAlertDefinitionStatus)(List) El estado de las definiciones de alerta recuperadas, como por ejemplo si se han desencadenado.
    alertStatusSummaries(AlertStatusSummary)(List) La lista preparada de alertas a visualizar.
    selectedCategoryFilter(String) "" Si el usuario desea ver las definiciones de alertas para instancias de proceso, para tareas o ambas.
    selectedTriggeredFilter(String) "true" Si el usuario desea ver sólo las definiciones de alerta que han desencadenado una alerta o todas las definiciones de alertas.
  3. En el diagrama del servicio de usuario, añada un servicio anidado, dos scripts del servidor y un coach. Renómbrelos utilizando la información de la tabla siguiente:
    Artefacto Nombre nuevo
    Servicio anidado Recuperar definiciones de alertas
    Script de servidor Correlacionar estado con AlertSummary
    Script de servidor (1) Evaluar selección de categorías
    Coach Panel de control Mis alertas
  4. Seleccione el servicio anidado y establezca sus propiedades:
    1. En sus propiedades de implementación, añada el Servicio de recuperación de estado de definiciones de alertas que ha creado en la sección anterior.
    2. En la correlación de entrada de las propiedades de correlación de datos, correlacione la variable categoryFilter del servicio de usuario con la variable categoryFilter del Servicio de recuperación de estado de definiciones de alertas.
    3. De forma similar, en la correlación de salida, correlacione la variable alertDefinitionsStatus del Servicio de recuperación de estado de definiciones de alertas con la variable alertDefinitionsStatus del servicio de usuario.
    Propiedades de correlación de datos del servicio anidado
  5. Seleccione el script Correlacionar estado con AlertSummary y, a continuación, añada código a sus propiedades de Implementación. El código correlaciona los objetos AlertDefinitionsStatus generados por el Servicio de recuperación de estado de definiciones de alertas con el objeto de negocio AlertStatusSummary local que ha creado anteriormente. El código también hace que la condición sea más legible para los usuarios.
    tw.local.alertStatusSummaries = new tw.object.listOf.AlertStatusSummary();
    var alerts = tw.local.alertDefinitionsStatus;
    
    // correlacionar el estado con alertStatusSummaries
    var num = 0;
    var numOfAlerts = 0;
    if(alerts != null) {
        for(var i=0; i<alerts.listLength; i++) {
            var status = alerts[i];
            
            // correlacionar sólo si el resumen de estado de alerta es necesario
            if(status.conditionMet || tw.local.selectedTriggeredFilter == "true") {
                
                // crear AlertSummary
                var alertSummary = new tw.object.AlertStatusSummary();
                alertSummary.currentValue = status.actualValue;
                alertSummary.displayName = status.definition.displayName;
                alertSummary.thresholdValue = status.definition.thresholdValue;
                
                // buscar el nombre de proyecto correcto
                var project = null;
                var invalid = false;
                if(status.definition.projectId != null) {
                    project = tw.system.model.findProcessAppByID(status.definition.projectId);
                    if(project != null) {
                        alertSummary.projectDisplayName = project.name;
                    } else {
                        alertSummary.projectDisplayName = status.definition.projectId;
                        invalid = true;
                    }
                }
                // buscar el nombre de instantánea correcto
                if(status.definition.snapshotId != null && project != null) {
                    var snapshot = project.findSnapshotByID(status.definition.snapshotId);
                    if(snapshot != null) {
                        alertSummary.snapshotDisplayName = snapshot.name;
                    } else {
                        alertSummary.snapshotDisplayName = status.definition.snapshotId;
                        invalid = true;
                    }
                }
                
                // concatenar resumen de condiciones
                if(status.definition.thresholdOperator == "GREATER") {
                    alertSummary.condition = "More than ";
                    alertSummary.thresholdOperator = ">"
                } else if (status.definition.thresholdOperator == "LESS") {
                    alertSummary.condition = "Less than ";
                    alertSummary.thresholdOperator = "<"
                } else {
                    alertSummary.condition = "Exactly ";
                    alertSummary.thresholdOperator = "=";
                }
                
                if(!invalid) {
                    alertSummary.condition += status.definition.thresholdValue;
                    alertSummary.condition += " " + status.definition.category.toLowerCase() + "(s)";
                    if(alertSummary.projectDisplayName != null) {
                        alertSummary.condition += " in project '" + alertSummary.projectDisplayName + "'";
                    }
                    if(alertSummary.snapshotDisplayName != null) {
                        alertSummary.condition += " and snapshot '" + alertSummary.snapshotDisplayName + "'";
                    }
                }            
                // si la alerta está activa o para visualizar alertas no activas, añadirlas a la lista
                if(status.conditionMet) {
                    alertSummary.status = "Triggered";
                    tw.local.alertStatusSummaries.insertIntoList(0, alertSummary);
                    num++;
                    numOfAlerts++;
                } else if (invalid) {
                    alertSummary.condition = "Esta definición de alerta hace referencia a una aplicación de proceso o instantánea que ya no está disponible en el sistema.";
                    alertSummary.status = "Invalid";
                    tw.local.alertStatusSummaries.insertIntoList(numOfAlerts, alertSummary);
                    num++;
                    numOfAlerts++;
                } else if (tw.local.selectedTriggeredFilter == "true") {
                    tw.local.alertStatusSummaries.insertIntoList(num, alertSummary);
                    num++;
                }
            }
        }
    }
  6. Seleccione el script Evaluar selección de categorías y, a continuación, añada código a sus propiedades de Implementación. El código crea el filtro global utilizado como entrada por el Servicio de recuperación de estado de definiciones de alertas.
    // si se ha seleccionado la categoría "All"
    if (tw.local.selectedCategoryFilter == "") {
        tw.local.categoryFilter = null;
        
    // si se ha seleccionado otra categoría, crear el categoryFilter correcto
    } else {
        tw.local.categoryFilter = new tw.object.listOf.String();
        tw.local.categoryFilter.insertIntoList(0, tw.local.selectedCategoryFilter);

Crear la interfaz de usuario

El ejemplo tiene una interfaz de usuario que se visualiza como un panel de control en la consola de administración de procesos.

  1. Cree la interfaz de usuario de filtro:
    1. Cree una vista de coach denominada Filtro de alertas. Se abrirá el diseñador de procesos Web para que pueda editarlo.
    2. En la página de visión general, seleccione Se puede disparar el suceso de límite.
    3. En la página Comportamiento, seleccione el manejador de sucesos de cambio y añádale el código siguiente:
      this.context.trigger();
    4. En la página Variables añada selected(String) como datos de negocio, selectionList(NameValuePair)(List) como opción de configuración y Dashboards como recurso de localización. El objeto NameValuePair se encuentra en el kit de herramientas TWSYS y el recurso de localización Dashboards se encuentra en el kit de herramientas SYSD.
      Vista de coach Filtro de alertas en el Diseñador de procesos web
    5. En la página Diseño, suelte un control Selección de categoría de la paleta en el lienzo.
    6. Enlace el control Selección de categorías a los datos de negocio selected.
    7. Vuelva al servicio de usuario de herencia Panel de control Mis alertas en el Process Designer de escritorio. Abra la página Coaches y seleccione el coach Panel de control Mis alertas.
    8. En el panel de control Mis alertas, añada una sección horizontal y cambie su nombre por Filtro.
    9. En la sección horizontal, añada dos instancias de las vistas de coach Filtro de alertas. Añada un elemento HTML personalizado entre ellas.
      Interfaz de usuario de filtro en Process Designer
    10. Seleccione la primera instancia de Filtro de alertas. En sus propiedades Generales, enlace la instancia a la variable selectedTriggeredFilter. Para distinguir entre los sucesos de límite transmitidos por las instancias de Filtro de alertas, añada triggeredFilter a la etiqueta.
    11. En sus propiedades de Configuración, expanda Lista de selección. Añada los siguientes pares nombre-valor:
      Nombre Valor
      Alertas desencadenadas false
      Todas true
      Pares de nombre y valor para el primer filtro
      Los nombres son los que el filtro visualiza en tiempo de ejecución.
    12. Seleccione la segunda instancia de Filtro de alertas. Enlácela a la variable selectedCategoryFilter. Añada categoryFilter a su etiqueta. Añada los siguientes pares nombre-valor:
      Nombre Valor
      Alertas de instancia de proceso INSTANCE
      Alertas de tarea TASK
      Todas  
    13. Seleccione el elemento HTML personalizado. Añada el siguiente código HTML:
      <div id="spacer">&nbsp;</div>
      El objetivo de este control es añadir algún espacio entre los dos filtros.
  2. Cree el área para visualizar las definiciones de alerta:
    1. En la paleta, abra el área Variables. Arrastre la variable alertStatusSummaries al diagrama. El diagrama muestra una tabla que contiene una columna para cada parámetro de la variable.
    2. Para abreviar las cabeceras de la tabla del panel de control, cambie las etiquetas de los controles siguientes:
      Etiqueta de control predeterminada Nueva etiqueta
      Nombre de visualización Nombre
      Operador de umbral  
      Valor del umbral Umbral
      Nombre de visualización de proyecto Aplicación de proceso
      Nombre de visualización de instantánea Instantánea
      Nombre de visualización de Bpd Proceso
    3. Para el control de operador Umbral, establezca su visibilidad de etiqueta en Ocultar.
  3. Añada una vista Controlador de renovación y una vista Controlador de servicio al diagrama y enlácelas a la variable refresh. Estas vistas son un mecanismo para renovar el panel de control cada 60 segundos.
  4. En las propiedades de configuración de la vista Controlador de renovación, establezca su servicio de localización en Cargador de mensajes localizados de paneles de control y establezca Tiempo entre renovaciones en la variable refreshInterval.

Completar el panel de control

El ejemplo tiene una interfaz de usuario que se visualiza como un panel de control en la consola de administración de procesos.

  1. En el diagrama del panel de control Mis alertas, realice las conexiones siguientes:
    Desde Hasta
    Iniciar Recuperar definiciones de alertas
    Recuperar definiciones de alertas Correlacionar estado con AlertSummary
    Correlacionar estado con AlertSummary Panel de control Mis alertas
    Panel de control Mis alertas Recuperar definiciones de alertas utilizando el suceso de límite del Controlador de servicio
    Panel de control Mis alertas Correlacionar estado con AlertSummary utilizando el suceso de límite del Filtro de alertas triggeredFilter
    Panel de control Mis alertas Evaluar selección de categorías utilizando el suceso de límite del Filtro de alertas categoryFilter
    Evaluar selección de categorías Recuperar definiciones de alertas
    Diagrama del servicio de usuario de herencia
  2. En la página Visión general, cambie Exponer como por Servicio de administración. Esto hará visible el servicio en Process Admin Console.