Beispiel: BPM-Alerts implementieren

Dieses Beispiel zeigt, wie die REST-APIs für BPM-Alerts verwendet werden, um ein Dashboard in der Process Admin-Konsole zu erstellen, das anzeigt, wann die Anzahl der Prozessinstanzen oder Tasks ein Alert auslöst.

Das Beispiel besteht aus einem Geschäftsobjekt zum Speichern der Alertinformationen, einem Integrationsservice zum Aufrufen von JavaScript-APIs, um die Alertinformationen abzurufen, sowie aus einer Benutzerschnittstelle zum Anzeigen der Alerts in der Process Admin-Konsole. Das Dashboard sieht wie im folgenden Screenshot aus:

In der Process Admin-Konsole angezeigtes Dashboard mit eigenen Alerts (My Alerts)

Dieses Beispiel ist nur eine Möglichkeit, um Administratoren darauf aufmerksam zu machen, wenn die Anzahl der Prozessinstanzen oder Tasks einen angegebenen Schwellenwert unterschreitet, erreicht oder überschreitet. So können Sie beispielsweise die APIs verwenden, um E-Mails zu erstellen, die an Administratoren gesendet werden, oder um eine Webseite zu erstellen, auf die Administratoren außerhalb der Process Admin-Konsole zugreifen können.
Tipp: Eine alternative Darstellung bietet das Beispiel für BPM-Alerts unter Use home in the IBM Business Process Manager Developer Center. Die Schritte in diesem Beispiel zeigen, wie Sie den größten Teil des Beispiels erstellen. Das Beispiel enthält einige Erweiterungen wie zum Beispiel Code und Artefakte für die Fehlerbehandlung.

Geschäftsobjekt für Alerts erstellen

Im vorliegenden Beispiel enthält das Geschäftsobjekt AlertStatusSummary Informationen zu Alertdefinitionen, die dem Benutzer im Dashboard angezeigt werden.

Das Dashboard im Beispiel verwendet eine Tabelle, in der jede Zeile eine andere Alertdefinition durch eine unterschiedliche Instanz von AlertStatusSummary darstellt.

  1. Erstellen Sie in Process Center die Prozessanwendung mit dem Beispiel für Alerts (Alerts Sample), in der die Dashboardartefakte gespeichert werden sollen.
  2. Öffnen Sie die neue Prozessanwendung in Process Designer.
  3. Fügen Sie das Dashboard-Toolkit als Abhängigkeit hinzu. Das Dashboard verwendet eine Reihe von Coachansichten und weitere Ressourcen in diesem Toolkit, um das eigene Aktualisierungsverhalten und das Aktualisierungsverhalten für die Filter zu steuern.
  4. Erstellen Sie das Geschäftsobjekt AlertStatusSummary.
  5. Setzen Sie den Definitionstyp auf Komplex strukturierter Typ und fügen Sie dem Objekt die folgenden Parameter hinzu:
    Parametername Beschreibung
    status(String) Gibt an, ob ein Alert für diese Alertdefinition ausgelöst wurde, oder gibt einen anderen Status an.
    displayName(String) Der Name der Alertdefinition, der für Benutzer sichtbar ist.
    condition(String) Der Ausdruck, mit dem festgestellt wird, ob der tatsächliche Wert des überwachten Parameters den Schwellenwert überschreitet.
    currentValue(String) Der Wert des Parameters, der überwacht wird.
    thresholdOperator(String) Gibt an, ob das Attribut gleich dem Schwellenwert, kleiner als der Schwellenwert oder größer als der Schwellenwert sein muss, damit der Alert ausgelöst wird.
    thresholdValue(String) Der Wert zum Auslösen des Alerts.
    projectDisplayName(String) Die Prozessanwendung, die auf Alertbedingungen überwacht wird.
    snapshotDisplayName(String) Der sichtbare Name für den Snapshot der Prozessanwendung, der auf Alertbedingungen überwacht wird.
    bpdDisplayName(String) Der für Benutzer sichtbare Name für die Geschäftsprozessdefinition (BPD).
    instanceStatus(String) Gibt an, ob ein Alert für die Prozessinstanz ausgelöst wurde, oder gibt einen anderen Status an.
    taskStatus(String) Gibt an, ob ein Alert für die Taskinstanz ausgelöst wurde, oder gibt einen anderen Status an.

Integrationsservice erstellen

In dem Beispiel ruft der Integrationsservice die Liste der Alertdefinitionen auf der Grundlage eines Filters ab.

In dem Beispiel wählt der Benutzer die Filter mithilfe der folgenden Benutzerschnittstelle im Dashboard aus:

Der erste Filter ist für ausgelöste Alerts oder alle Alerts. Der zweite Filter ist für Prozessinstanzalerts, Task-Alerts oder alle Alerts.
Der Integrationsservice akzeptiert als Eingabe die Benutzerauswahl, ob Prozessinstanzalerts oder Task-Alerts oder beide Typen von Alertdefinitionen angezeigt werden sollen. Der andere Filter (für ausgelöste Alerts) wird auf die Ausgabe dieses Integrationsservice als Teil der Definition des Heritage-Benutzerservice angewendet. Als Ausgabe erstellt der Integrationsservice eine Liste der BPMAlertDefinitionStatus-Geschäftsobjekte. Diese Objekte enthalten die Alertdefinitionen zusammen mit der Angabe, ob die Alerts ausgelöst worden sind oder nicht.

  1. Erstellen Sie einen Integrationsservice namens Alert Definitions Status Retrieval Service zum Abruf des Status für Alertdefinitionen.
  2. Fügen Sie die folgende Eingabevariable hinzu:
    • categoryFilter(String)(List)

    Der Service ermittelt anhand dieser Eingabe, welcher Typ von Alertdefinitionen abgerufen werden soll.

  3. Fügen Sie die folgende Ausgabevariable hinzu:
    • alertDefinitionsStatus(BPMAlertDefinitionStatus)(List)

    Die Ausgabevariable enthält die Liste der Alertdefinitionen, die der Service auf der Grundlage des vom Benutzer gewünschten Alerttyps abgerufen hat. Der Typ BPMAlertDefinitionStatus befindet sich im Toolkit für Systemdaten, um BPM-Alerts zu unterstützen.

    Die Eingabe- und Ausgabevariablen des Integrationsservice

  4. Fügen Sie im zugehörigen Diagramm ein Server-Script namens Retrieve Alerts zum Abrufen von Alerts hinzu. Verbinden Sie das Startereignis mit dem Server-Script und verbinden Sie anschließend das Server-Script mit dem Endereignis.
    Ergebnisdiagramm
  5. Wählen Sie das Server-Script aus und fügen Sie auf der zugehörigen Eigenschaftenseite Implementation den entsprechenden Code für folgende Aktionen hinzu:
    • Festlegen des Filters, der angewendet werden soll.
    • Abrufen der dem Typenfilter entsprechenden Alertdefinitionen zum Anzeigen in einer Liste.
    • Abrufen der Informationen dazu, welche Alertdefinitionen einen Alert ausgelöst haben.
    var ids = null;
    
    // if categoryFilter is set, use it to get the alert definitions
    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);
    }}
    
    // get the status of the retrieved alert definitions
    if(ids == null || ids.length > 0) {
    	var alertStatusResponse = tw.system.getAlertDefinitionsStatus(ids, true);
    	tw.local.alertDefinitionsStatus = alertStatusResponse.alertDefinitionStatus;
    }

Benutzerservice zwecks Unterstützung der Benutzerschnittstelle erstellen

In dem Beispiel wird ein Heritage-Benutzerservice verwendet, um den Datenfluss zwischen dem Integrationsservice und der in einem Coach definierten Benutzerschnittstelle zu definieren.

Um die Benutzerschnittstelle als Verwaltungsservice in der Process Admin-Konsole verfügbar machen zu können, ist ein Heritage-Benutzerservice anstelle eines clientseitigen Benutzerservice erforderlich.
  1. Erstellen Sie einen Heritage-Benutzerservice namens 'My Alerts Dashboard' für ein Dashboard mit eigenen Alerts.
  2. Fügen Sie dem Benutzerservice 'My Alerts Dashboard' die folgenden privaten Variablen hinzu:
    Private Variablen Standardwert Beschreibung
    refresh(Boolean) Bei Festlegen von 'true' wird ein Grenzereignis ausgelöst, woraufhin der Integrationsservice aufgerufen wird, um die Alertdefinitionen erneut abzurufen.
    refreshInterval(Integer) 60 Die Anzahl der Sekunden zwischen Aktualisierungen.
    categoryFilter(String)(List) Der Filtertyp, der verwendet werden soll, um Alertdefinitionen abzurufen, wenn der Benutzer Prozessinstanzalerts oder Task-Alerts ausgewählt hat. Gültige Werte sind "INSTANCE" oder "TASK". Diese Variable ist optional. Wird kein Wert angegeben, werden beide Typen von Alertdefinitionen abgerufen.
    alertDefinitionsStatus(BPMAlertDefinitionStatus)(List) Der Status der abgerufenen Alertdefinitionen wie beispielsweise die Angabe, ob die Alertdefinitionen ausgelöst worden sind.
    alertStatusSummaries(AlertStatusSummary)(List) Die vorbereitete Liste der Alerts, die angezeigt werden sollen.
    selectedCategoryFilter(String) "" Gibt an, ob der Benutzer die Alertdefinitionen für Prozessinstanzen, Tasks oder beides sehen will.
    selectedTriggeredFilter(String) "true" Gib an, ob der Benutzer nur Alertdefinitionen sehen will, die ein Alert ausgelöst haben, oder ob der Benutzer alle Alertdefinitionen sehen will.
  3. Fügen Sie im Benutzerservicediagramm einen verschachtelten Service, zwei Server-Scripts und einen Coach hinzu. Benennen Sie diese Elemente anhand der Informationen in der folgenden Tabelle um:
    Artefakt Neuer Name
    Verschachtelter Service Retrieve Alert Definitions (Alertdefinitionen abrufen)
    Server-Script Map Status to AlertSummary (Status zu Alertzusammenfassung zuordnen)
    Server-Script (1) Eval category selection (Kategorieauswahl auswerten)
    Coach My Alerts Dashboard (Dashboard für eigene Alerts)
  4. Wählen Sie den verschachtelten Service aus und legen Sie dann die zugehörigen Eigenschaften fest:
    1. Ordnen Sie den im vorherigen Abschnitt erstellten 'Alert Definitions Status Retrieval Service' in den zugehörigen Implementierungseigenschaften entsprechend zu.
    2. Orden Sie in der Eingabezuordnung der Datenzuordnungseigenschaften die Variable categoryFilter des Benutzerservice zur Variablen categoryFilter des 'Alert Definitions Status Retrieval Service' zu.
    3. Ordnen Sie ebenso in der Ausgabezuordnung die Variable alertDefinitionsStatus des 'Alert Definitions Status Retrieval Service' zur Variablen alertDefinitionsStatus des Benutzerservice zu.
    Datenzuordnungseigenschaften des verschachtelten Service
  5. Wählen Sie das Script Map Status to AlertSummary aus und fügen Sie anschließend entsprechenden Code zu den zugehörigen Implementierungseigenschaften (Implementation) hinzu. Der Code ordnet die vom 'Alert Definitions Status Retrieval Service' ausgegebenen AlertDefinitionsStatus-Objekte dem zuvor von Ihnen erstellten lokalen Objekt AlertStatusSummary zu. Darüber hinaus sorgt der Code dafür, dass die Bedingung vom Benutzer leichter lesbar ist.
    tw.local.alertStatusSummaries = new tw.object.listOf.AlertStatusSummary();
    var alerts = tw.local.alertDefinitionsStatus;
    
    // map the status to the alertStatusSummaries
    var num = 0;
    var numOfAlerts = 0;
    if(alerts != null) {
        for(var i=0; i<alerts.listLength; i++) {
            var status = alerts[i];
            
            // map only if the alert status summary is needed
            if(status.conditionMet || tw.local.selectedTriggeredFilter == "true") {
                
                // build the AlertSummary
                var alertSummary = new tw.object.AlertStatusSummary();
                alertSummary.currentValue = status.actualValue;
                alertSummary.displayName = status.definition.displayName;
                alertSummary.thresholdValue = status.definition.thresholdValue;
                
                // find the correct project name
                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;
                    }
                }
                // find the correct snapshot name
                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;
                    }
                }
                
                // concatenate the condition summary
                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 + "'";
                    }
                }            
                // if the alert is active or to display non-active alerts, add them to the list
                if(status.conditionMet) {
                    alertSummary.status = "Triggered";
                    tw.local.alertStatusSummaries.insertIntoList(0, alertSummary);
                    num++;
                    numOfAlerts++;
                } else if (invalid) {
                    alertSummary.condition = "This alert definition targets a process application or snapshot that is no longer available on the system.";
                    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. Wählen Sie das Script Eval category selection aus und fügen Sie anschließend entsprechenden Code zu den zugehörigen Implementierungseigenschaften (Implementation) hinzu. Der Code erstellt den Gesamtfilter, der vom 'Alert Definitions Status Retrieval Service' als Eingabe verwendet wird.
    // if "All" category has been selected
    if (tw.local.selectedCategoryFilter == "") {
        tw.local.categoryFilter = null;
        
    // if another category has been selected, build the correct categoryFilter
    } else {
        tw.local.categoryFilter = new tw.object.listOf.String();
        tw.local.categoryFilter.insertIntoList(0, tw.local.selectedCategoryFilter);

Benutzerschnittstelle erstellen

In dem Beispiel wird eine Benutzerschnittstelle verwendet, die als Dashboard in der Process Admin-Konsole angezeigt wird.

  1. Erstellen Sie die Benutzerschnittstelle für Filter:
    1. Erstellen Sie eine Coachansicht namens Alert Filter für Alertfilter. Der Web-Process Designer wird zwecks Bearbeitung geöffnet.
    2. Wählen Sie auf der Übersichtsseite die Option für Kann Grenzereignisse auslösen aus.
    3. Wählen Sie auf der Seite für 'Verhalten' den Änderungsereignishandler aus und fügen Sie diesem Handler den folgenden Code hinzu:
      this.context.trigger();
    4. Fügen Sie auf der Seite für 'Variablen' die Variable selected(String) als Geschäftsdatend, die Variable selectionList(NameValuePair)(List) als Konfigurationsoption und 'Dashboards' als Lokalisierungsressource hinzu. Das Objekt NameValuePair befindet sich im Toolkit TWSYS, und die Lokalisierungsressource 'Dashboard' befindet sich im Toolkit SYSD. Wenn das Objekt NameValuePair in der Auswahlliste nicht angezeigt wird, wählen Sie im unteren Bereich der Auswahlanzeige die Option Alle Geschäftsobjekte anzeigen aus.
      Coachansicht 'Alertfilter' im Web-Process Designer
    5. Ziehen Sie auf der Seite 'Layout' ein Steuerelement 'Kategorieauswahl' von der Palette in den Erstellungsbereich.
    6. Binden Sie das Steuerelement 'Kategorieauswahl' an die Geschäftsdaten vom Typ selected.
    7. Gehen Sie zurück zum Heritage-Benutzerservice 'My Alerts Dashboard' im Desktop-Process Designer. Öffnen Sie die Seite 'Coaches' und wählen Sie den Coach 'My Alerts Dashboard' aus.
    8. Fügen Sie in 'My Alerts Dashboard' einen horizontalen Abschnitt hinzu und ändern Sie dessen Namen in Filter.
    9. Fügen Sie im horizontalen Abschnitt zwei Instanzen der Coachansicht 'Alertfilter' hinzu. Fügen Sie zwischen ihnen ein Element für angepassten HTML-Code hinzu.
      Benutzerschnittstelle 'Filter' in Process Designer
    10. Wählen Sie die erste Instanz von 'Alertfilter' aus. Binden Sie die Instanz in den zugehörigen allgemeinen Eigenschaften an die Variable selectedTriggeredFilter. Um zwischen dem Grenzereignisbroadcast der Alertfilterinstanzen zu unterscheiden, hängen Sie an die Kennzeichnung triggeredFilter an.
    11. Erweitern Sie in den zugehörigen Konfigurationseigenschaften den Eintrag Auswahlliste. Fügen Sie die folgenden Name/Wert-Paare hinzu:
      Name Wert
      Triggered Alerts (Ausgelöste Alerts) false
      All (Alle) true
      Name/Wert-Paare für ersten Filter
      Die Namen werden vom Filter zur Laufzeit angezeigt.
    12. Wählen Sie die zweite Instanz von 'Alertfilter' aus. Binden Sie die Instanz an die Variable selectedCategoryFilter. Hängen Sie categoryFilter an die Kennzeichnung an. Fügen Sie die folgenden Name/Wert-Paare hinzu:
      Name Wert
      Process instance alerts (Prozessinstanzalerts) INSTANCE
      Task alerts (Task-Alerts) TASK
      All (Alle)  
    13. Wählen Sie das Element für benutzerdefinierten HTML-Code aus. Fügen Sie den folgenden HTML-Code hinzu:
      <div id="spacer">&nbsp;</div>
      Der Zweck dieses Steuerelements besteht darin, zwischen den beiden Filtern einen gewissen Zwischenraum einzufügen.
  2. Erstellen Sie den Bereich zum Anzeigen der Alertdefinitionen:
    1. Öffnen Sie in der Palette den Bereich für 'Variablen'. Ziehen Sie die Variable alertStatusSummaries in das Diagramm. Das Diagramm zeigt eine Tabelle an, die für jeden Parameter der Variablen jeweils eine Spalte enthält.
    2. Um die Überschriften in der Dashboardtabelle zu kürzen, ändern Sie die Bezeichnungen für die folgenden Steuerelemente:
      Standardmäßige Bezeichnung des Steuerelements Neue Bezeichnung
      Anzeigename Name
      Schwellenwertoperator  
      Schwellenwert Schwellenwert
      Anzeigename des Projekts Prozessanwendung
      Anzeigename des Snapshots Snapshot
      Anzeigename einer Geschäftsprozessdefinition (BPD) Prozess
    3. Legen Sie für das Steuerelement 'Schwellenwertoperator' als Sichtbarkeit der Bezeichnung den Wert Ausblenden fest.
  3. Fügen Sie eine Ansicht 'Aktualisierens-Controller' und eine Ansicht 'Service-Controller' zum Diagramm hinzu und binden Sie die beiden Ansichten an die Variable refresh. Bei diesen Ansichten handelt es sich um einen Mechanismus, mit dem das Dashboard alle 60 Sekunden aktualisiert wird.
  4. Legen Sie in den Konfigurationseigenschaften der Ansicht 'Controller aktualisieren' für den zugehörigen Lokalisierungsservice den Wert Ladeprogramm für lokalisierte Dashboardnachrichten fest und legen Sie für Zeit zwischen Aktualisierungen die Variable refreshInterval fest.

Dashboard vervollständigen

In dem Beispiel wird eine Benutzerschnittstelle verwendet, die als Dashboard in der Process Admin-Konsole angezeigt wird.

  1. Nehmen Sie im Diagramm 'My Alerts Dashboard' die folgenden Verbindungen vor:
    Von Bis
    Start (Starten) Retrieve Alert Definitions (Alertdefinitionen abrufen)
    Retrieve Alert Definitions (Alertdefinitionen abrufen) Map Status to AlertSummary (Status zu Alertzusammenfassung zuordnen)
    Map Status to AlertSummary (Status zu Alertzusammenfassung zuordnen) My Alerts Dashboard (Dashboard für eigene Alerts)
    My Alerts Dashboard (Dashboard für eigene Alerts) Retrieve Alert Definitions (Alertdefinitionen abrufen); hierfür wird das Grenzereignis des Service-Controllers verwendet.
    My Alerts Dashboard (Dashboard für eigene Alerts) Map Status to AlertSummary (Status zu Alertzusammenfassung zuordnen); hierfür wird das Grenzereignis des triggeredFilter-Alertfilters verwendet.
    My Alerts Dashboard (Dashboard für eigene Alerts) Eval category selection (Kategorieauswahl auswerten); hierfür wird das Grenzereignis des categoryFilter-Alertfilters verwendet.
    Eval category selection (Kategorieauswahl auswerten) Retrieve Alert Definitions (Alertdefinitionen abrufen)
    Diagramm des Heritage-Benutzerservice
  2. Ändern Sie auf der Übersichtsseite den Wert für Verfügbar machen als in Verwaltungsservice. Dadurch wird der Service in der Process Admin-Konsole sichtbar.