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:

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.
- Erstellen Sie in Process Center die Prozessanwendung mit dem Beispiel für Alerts (Alerts Sample), in der die Dashboardartefakte gespeichert werden sollen.
- Öffnen Sie die neue Prozessanwendung in Process Designer.
- 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.
- Erstellen Sie das Geschäftsobjekt AlertStatusSummary.
- 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:

- Erstellen Sie einen Integrationsservice namens Alert Definitions Status Retrieval Service zum Abruf des Status für Alertdefinitionen.
- Fügen Sie die folgende Eingabevariable hinzu:
- categoryFilter(String)(List)
Der Service ermittelt anhand dieser Eingabe, welcher Typ von Alertdefinitionen abgerufen werden soll.
- 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.

- 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.

- 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.
- Erstellen Sie einen Heritage-Benutzerservice namens 'My Alerts Dashboard' für ein Dashboard mit eigenen Alerts.
- 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. - 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) - Wählen Sie den verschachtelten Service aus und legen Sie dann die zugehörigen Eigenschaften fest:
- Ordnen Sie den im vorherigen Abschnitt erstellten 'Alert Definitions Status Retrieval Service' in den zugehörigen Implementierungseigenschaften entsprechend zu.
- Orden Sie in der Eingabezuordnung der Datenzuordnungseigenschaften die Variable categoryFilter des Benutzerservice zur Variablen categoryFilter des 'Alert Definitions Status Retrieval Service' zu.
- Ordnen Sie ebenso in der Ausgabezuordnung die Variable alertDefinitionsStatus des 'Alert Definitions Status Retrieval Service' zur Variablen alertDefinitionsStatus des Benutzerservice zu.

- 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++; } } } } - 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.
- Erstellen Sie die Benutzerschnittstelle für Filter:
- Erstellen Sie eine Coachansicht namens Alert Filter für Alertfilter. Der Web-Process Designer wird zwecks Bearbeitung geöffnet.
- Wählen Sie auf der Übersichtsseite die Option für Kann Grenzereignisse auslösen aus.
- 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(); - 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.

- Ziehen Sie auf der Seite 'Layout' ein Steuerelement 'Kategorieauswahl' von der Palette in den Erstellungsbereich.
- Binden Sie das Steuerelement 'Kategorieauswahl' an die Geschäftsdaten vom Typ selected.
- 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.
- Fügen Sie in 'My Alerts Dashboard' einen horizontalen Abschnitt hinzu und ändern Sie dessen Namen in Filter.
- 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.

- 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.
- 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 Die Namen werden vom Filter zur Laufzeit angezeigt.
- 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) - Wählen Sie das Element für benutzerdefinierten HTML-Code aus. Fügen Sie den folgenden HTML-Code hinzu:
Der Zweck dieses Steuerelements besteht darin, zwischen den beiden Filtern einen gewissen Zwischenraum einzufügen.<div id="spacer"> </div>
- Erstellen Sie den Bereich zum Anzeigen der Alertdefinitionen:
- Ö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.
- 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 - Legen Sie für das Steuerelement 'Schwellenwertoperator' als Sichtbarkeit der Bezeichnung den Wert Ausblenden fest.
- 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.
- 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.
- 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) 
- Ä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.