Zeit-Trigger
Einführung in Zeit-Trigger
Ein Workflow kann mehrere Zeit-Trigger enthalten.
Abbildung 67: ConSol CM Process Designer - Zeit-Trigger
Ein Zeit-Trigger ist ein Mechanismus, der reagiert, wenn ein bestimmter Zeitraum abgelaufen ist. Dies kann zum Beispiel in folgenden Situationen erforderlich sein:
- Anwendungsfall 1:
Ein Bearbeiter möchte ein Ticket für eine bestimmte Zeit auf Wiedervorlage legen, da er weiß, dass der Kunde bis dahin nicht erreichbar ist. - Anwendungsfall 2:
Das System soll die Eskalationszeit automatisch kontrollieren, d. h. wenn ein Ticket eingeht und nicht bearbeitet wird, soll es eine Warnung geben (dies kann ein Overlay am Ticket-Icon, eine E-Mail an den Teamleiter oder eine andere Aktion sein). - Anwendungsfall 3:
Ein Ticket wurde gelöst und der Bearbeiter schließt es. Dies soll allerdings nur das vorläufige Ende sein und das Ticket soll nach einem bestimmten Zeitraum technisch geschlossen werden.
Diese Anwendungsfälle können mittels Zeit-Triggern implementiert werden.
Ein Zeit-Trigger kann so konfiguriert werden, dass er einen Arbeitszeitkalender verwendet, d. h. nur die Zeiten berücksichtigt, die als Arbeitszeiten definiert sind.
Ein Zeit-Trigger kann hängen an ...
- einem Bereich
Dann kontrolliert er alle Tickets, die sich gerade in diesem Bereich befinden. - einer Aktivität
Dann kontrolliert er nur die Tickets, die diese Aktivität gerade durchlaufen haben.
Ein Zeit-Trigger muss einen der beiden folgenden Typen haben:
- manuell
- mit einer definierten Zeitspanne
Sie als Workflow-Entwickler müssen alles implementieren, was geschehen soll, wenn ein Zeit-Trigger gefeuert hat! Es gibt keine automatischen Aktionen. Der Zeit-Trigger sorgt lediglich für das Signal Zeit abgelaufen, genauso wie ein Wecker.
Hinzufügen eines Zeit-Triggers zu einem Workflow
Hinzufügen eines Zeit-Triggers zu einem Bereich
Klicken Sie in der Palette auf das Zeit-Trigger-Symbol und ziehen Sie es in den gewünschten Bereich. Es wird automatisch an den oberen Rand des Bereichs angefügt. Sie können die Position später ändern (ziehen Sie den Trigger nach links oder rechts, um die Reihenfolge der Trigger zu ändern oder das Layout zu verbessern).
Ein Zeit-Trigger, der an einem Bereich hängt, kann nicht in einen anderen Bereich oder eine Aktivität verschoben werden. Wenn Sie einen Zeit-Trigger an einen anderen Bereich oder eine Aktivität anfügen möchten, entfernen Sie den bereits erstellen Trigger und erstellen Sie einen neuen Trigger für den richtigen Bereich bzw. die Aktivität.
Um die Eigenschaften des Triggers zu konfigurieren, wählen Sie ihn im Bearbeitungsbereich aus und setzen Sie im Eigenschaftseditor die richtigen Werte. Siehe Abschnitt Eigenschaften eines Zeit-Triggers.
Sie können vom Trigger ausgehend Verbindungen zu Aktivitäten oder Entscheidungsknoten ziehen, die sich hinter dem Trigger befinden sollen. Der erste Schritt, der nach dem Zeit-Trigger ausgeführt wird, muss immer eine automatische Aktivität sein!
Hinzufügen eines Zeit-Triggers zu einer Aktivität
Klicken Sie in der Palette auf das Zeit-Trigger-Symbol und ziehen Sie es in die gewünschte Aktivität. Es wird an die Ecke der Aktivität angefügt.
Ein Zeit-Trigger, der an einer Aktivität hängt, kann nicht in eine anderen Aktivität oder einen Bereich verschoben werden. Wenn Sie einen Zeit-Trigger an eine andere Aktivität oder einen Bereich anfügen möchten, entfernen Sie den bereits erstellen Trigger und erstellen Sie einen neuen Trigger für die richtige Aktivität bzw. den Bereich.
Um die Eigenschaften des Triggers zu konfigurieren, wählen Sie ihn im Bearbeitungsbereich aus und setzen Sie im Eigenschaftseditor die richtigen Werte. Siehe Abschnitt Eigenschaften eines Zeit-Triggers.
Sie können vom Trigger ausgehend Verbindungen zu Aktivitäten oder Entscheidungsknoten ziehen, die sich hinter dem Trigger befinden sollen. Der erste Schritt, der nach dem Zeit-Trigger ausgeführt wird, muss immer eine automatische Aktivität sein!
Eigenschaften eines Zeit-Triggers
Ein Zeit-Trigger hat folgende Eigenschaften:
-
Name
Pflichtfeld. Der technische Name des Triggers. Er wird automatisch gesetzt, kann aber manuell geändert werden.
-
Minuten/Stunden/Tage
Hier können Sie den Zeitraum angeben, nach dem der Trigger feuern soll. Die Anzeige bezieht sich immer auf einen 24-Stunden-Tag, d. h. wenn Sie 30 Stunden als Reaktionszeit eingeben und den Workflow erneut öffnen, steht dort 1 Tag, 6 Stunden.
-
Kalender
Optional. Markieren Sie diese Checkbox, wenn der Arbeitszeitkalender bei der Berechnung des Zeitraums berücksichtigt werden soll.
Denken Sie daran, dass drei Schritte notwendig sind, um sicherzustellen, dass Zeiträume mit einem Arbeitszeitkalender berechnet werden:
- Definieren Sie einen Arbeitszeitkalender (siehe ConSol CM Administratorhandbuch, Abschnitt Arbeitszeitkalender).
- Weisen Sie den richtigen Arbeitszeitkalender einer Queue zu (siehe ConSol CM Administratorhandbuch, Abschnitt Queue-Verwaltung).
- Markieren Sie die Checkbox Kalender für jeden Trigger, der den Kalender benutzen soll.
Prinzip der Verwendung eines Arbeitszeitkalenders:
1 Tag bedeutet 24 Stunden absolute Zeit; dies hat nichts mit der Verwendung eines Kalenders zu tun. Der Kalender spielt nur eine Rolle, wenn der Zeit-Trigger aktiviert ist. Dann werden die 24 Stunden, d. h. 86400000 Millisekunden, als Eingabe für den Arbeitszeitkalender verwendet (sofern der Kalender aktiviert ist).
Beispiel:
Wenn der Zeitraum 1 Tag = 24 Stunden ohne Kalender ist, werden die 24 Stunden wie reguläre Zeit berechnet. Die Eskalation wird also einen Tag später zur gleichen Uhrzeit ausgelöst.
Im Gegensatz dazu: Wenn ein Kalender verwendet wird (mit zum Beispiel 7 Arbeitsstunden pro Arbeitstag), werden die 24 Stunden entsprechend dem Kalender aufgeteilt. Der Trigger feuert also über 3 Tage später (24 Stunden = 3 x 7 Stunden + 3 Stunden).
Siehe auch Abschnitt Arbeiten mit Kalendern und Zeiten.
-
wiederholbar
Optional. Markieren Sie diese Checkbox, um sicherzustellen, dass der Trigger mehr als einmal für ein Ticket feuern kann. Wenn ein Trigger wiederholbar ist, wird er, sofort nachdem er gefeuert hat, zurückgesetzt, d. h. die Zeitmessung beginnt erneut.
Das Skript zu Beginn wird erneut ausgeführt. Das erste Feuern des Triggers wird durch den (technischen) Benutzer admin ausgelöst, alle folgenden durch den Job Executor.
-
Skript nach Ablauf
Optional. Es kann ein Skript definiert werden, das ausgeführt wird, wenn das Zeitintervall, das durch den Trigger kontrolliert wird, abgelaufen ist, d. h. wenn der Trigger feuert. Der Rückgabewert des Skripts bestimmt, ob die folgende automatische Aktivität ausgeführt wird oder nicht.
-
Skript zu Beginn
Optional. Es kann ein Skript definiert werden, das ausgeführt wird, wenn der Zeit-Trigger anfängt, die Zeit zu messen, d. h. wenn das Ticket in den Bereich bzw. die Aktivität eingetreten ist, an dem/der der Trigger hängt. In diesem Skript können Sie entweder:
- null oder false zurückgeben, sodass der Timer nicht initialisiert wird und nicht feuert, oder
- einen Long-Wert zurückgeben, der die Millisekunden vom aktuellen Zeitpunkt bis zum Zeitpunkt des Feuerns des Triggers darstellt.
Der berechnete Long-Wert muss als Parameter der Methode trigger.setDueTime() übergeben werden, um den Timer zu initialisieren.
-
manuell
Optional, nur für Zeit-Trigger an Aktivitäten. Markieren Sie diese Checkbox, wenn der Bearbeiter die Zeit auswählen soll, nach der der Trigger feuern soll. Für den Bearbeiter wird ein Datumsauswahl-Feld (Kalender) angezeigt. Die Felder zum Setzen des Datums und der Zeit und das Feld Skript zu Beginn sind nicht für manuelle Zeit-Trigger verfügbar.
-
Wiederholungsintervall
Die Zeit in Sekunden, nach der die Trigger-Ausführung erneut ausgeführt werden soll, für den Fall, dass ein Skript in einen Fehler gelaufen ist. Die Zeit kann im Admin Tool konfiguriert werden (Property jobExecutor.timerRetryInterval.seconds).
Abbildung 68: ConSol CM Process Designer - Eigenschaften eines Zeit-Triggers
Geschäftslogik und Initialisierung eines Zeit-Triggers
Die Zeitmessung eines Triggers wird begonnen (d. h. der Trigger wird initialisiert), wenn das Ticket in den Bereich bzw. die Aktivität eintritt. Sie hält an (d. h. der Trigger feuert), wenn der definierte Zeitraum, der als fester Wert gesetzt wurde (Minuten/Stunden/Tage), oder die manuell definierte Zeit verstrichen ist.
Wenn Sie als Workflow-Entwickler einen Trigger mit anderen Werten initialisieren möchten, muss dies mit Skripten erfolgen. Dieser Abschnitt enthält einige kurze Beispiele, eine detaillierte Erklärung zur Programmierung mit Zeit-Triggern in Workflows finden Sie im Abschnitt Arbeiten mit Kalendern und Zeiten. In diesen Kapiteln stehen auch Code-Beispiele.
- Beispiel 1:
Die Reaktionszeit für ein Ticket soll anhand der Priorität berechnet werden. Im Skript zu Beginn werden die verschiedenen Reaktionszeiten verwendet (ein guter Weg, um dies zu implementieren, wäre über kundenspezifische System-Properties) und die Reaktionszeit wird berechnet. Danach wird der Trigger initialisiert, d. h. das Zeitintervall wird gesetzt. - Beispiel 2:
Wenn eine E-Mail für ein Ticket eingegangen ist und nach drei Stunden noch kein Bearbeiter die E-Mail gelesen und sich um das Ticket gekümmert hat, soll eine Warnung ausgelöst werden. Um dies zu implementieren, steht nach einer eingehenden E-Mail (siehe Abschnitt Mail-Trigger) eine automatische Aktivität, die den Zeit-Trigger mit drei Stunden reinitialisiert.
Ein Zeit-Trigger kann auch deaktiviert werden. In Beispiel 2 ist dies erforderlich, um zu verhindern, dass der Zeit-Trigger am Anfang feuert, da er erst initialisiert werden soll, wenn eine E-Mail eingegangen ist.
Beispiele für Zeit-Trigger
Die Implementierungen für die oben genannten Anwendungsfälle (siehe Einführung in Zeit-Trigger) wären:
- Anwendungsfall 1:
Hängen Sie einen manuellen Zeit-Trigger an die Aktivität Wiedervorlage. Der Bearbeiter kann das gewünschte Enddatum im Datumsauswahl-Fenster im Web Client auswählen. Normalerweise wird das Ticket dann wieder in die aktiven Tickets verschoben.Abbildung 69: ConSol CM Process Designer - Anwendungsfall 1: Workflow
Abbildung 70: ConSol CM Process Designer - Anwendungsfall 1: Eigenschaftseditor für Zeit-Trigger
Abbildung 71: ConSol CM Web Client - Anwendungsfall 1: Datumsauswahl-Feld
- Anwendungsfall 2:
Setzen Sie einen Zeit-Trigger an den Bereich, in dem neue Tickets erstellt werden. Definieren Sie die Zeit für den Trigger (kann von SLAs abhängen), z. B. vier Stunden. Setzen Sie einen Entscheidungsknoten hinter den Trigger, um festzustellen, ob das Ticket von einem Bearbeiter bearbeitet wird oder nicht. Wenn nicht, wird eine E-Mail an den Teamleiter gesendet.Abbildung 72: ConSol CM Process Designer - Anwendungsfall 2: Workflow
Abbildung 73: ConSol CM Process Designer - Anwendungsfall 2: Eigenschaftseditor für Zeit-Trigger
Abbildung 74: ConSol CM Web Client - Anwendungsfall 2: Ticketliste
- Anwendungsfall 3:
Setzen Sie einen Zeit-Trigger an die Aktivität Ticket abschließen mit Löschung (positiv) und setzen Sie eine bestimmte Zeitspanne für den Trigger, z. B. fünf Tage. Hinter dem Trigger befindet sich der Endknoten des Prozesses. Das Ticket kann fünf Tage lang noch editiert werden. Danach wird es automatisch geschlossen.Abbildung 75: ConSol CM Process Designer - Anwendungsfall 3: Workflow
Abbildung 76: ConSol CM Process Designer - Anwendungsfall 3: Eigenschaftseditor für Zeit-Trigger
Abbildung 77: ConSol CM Web Client - Geschlossenes Ticket
Skripte mit Zeit-Triggern
Die folgenden Methoden sind wichtig, wenn Sie mit Zeit-Triggern arbeiten:
TimerTrigger
Das wichtigste Objekt in einem Skript für einen Trigger ist der Trigger selber. Es handelt sich um ein Objekt der Java-Klasse TimerTrigger und es ist implizit in jedem Trigger-Skript als trigger verfügbar.
- TimerTrigger.setDueTime(long pDueTime in millisecs)
Setzt die Zeit, nach der der Trigger feuern soll, in Millisekunden angegeben. Die als Methodenparameter angegebene Zeit wird zur ursprünglichen Startzeit des Triggers hinzugerechnet, d. h. zu dem Zeitpunkt, an dem das Ticket in den Bereich bzw. die Aktivität gewandert ist, in der sich der Trigger befindet. setDueTime() definiert also den Zeitraum in Millisekunden von der Eintrittszeit zum gewünschten Feuern des Triggers.
workflowApi
workflowApi (die Singleton-Instanz von WorkflowContextService) bietet zwei Methoden zum Reinitialisieren des Triggers. Reinitialisieren bedeutet, dass der Trigger auf seinen ursprünglichen Zustand zurückgesetzt wird, sodass noch keine Zeit abgelaufen ist. Für beide Methoden muss der Name des Triggers (pTriggerName) als Pfad angegeben werden. Eine Erklärung dazu finden Sie im Abschnitt über die Arbeit mit Pfadinformationen.
-
reinitializeTrigger(String pTriggerName)
Der Trigger wird mit dem Startdatum, an dem das Ticket in den entsprechenden Bereich gewandert ist, reinitialisiert. - reinitializeTrigger(String pTriggerName, Date pBaseDate)
Der Trigger wird reinitialisiert und das Startdatum (BaseDate) wird explizit gesetzt. Auf diese Weise kann ein Trigger mit einem Datum reinitialisiert werden, das vom Datum abweicht, an dem das Ticket in den entsprechenden Bereich gewandert ist. pBaseDate ist ein absolutes Datum, das als Java-Datumsobjekt angegeben ist. - workflowApi.deactivateTimer()
(unterschiedliche Methodensignaturen)
Deaktiviert den angegebenen Zeit-Trigger, d. h. der Trigger feuert erst, wenn er reinitialisiert wird.
(Es gibt keine Methode activateTimer(). Verwenden Sie workflowApi.reinitializeTrigger(), um einen Trigger wieder zu aktivieren).
Siehe auch Abschnitt Arbeiten mit Kalendern und Zeiten.
Ticket
Wenn Sie einen manuellen Zeit-Trigger in einer Aktivität verwenden, können Sie das Eskalations-/Wiedervorlagedatum, das durch den Bearbeiter gesetzt wurde, über die Methode getStatusDate() des Objekts Ticket abrufen.
Übersicht über die TimerTrigger-Ereignisse
Die folgende Tabelle enthält eine Übersicht über die möglichen Ereignisse von Zeit-Triggern. Beachten Sie bei der Arbeit mit Zeit-Triggern die Funktionen der Objekte und Methoden.
Ereignis im Prozess |
Zeit-Trigger-Ereignis |
Ergebnis |
---|---|---|
Ticket läuft in den Bereich, an den der Zeit-Trigger angehängt ist |
Skript zu Beginn wird ausgeführt |
Skript zu Beginn gibt null oder false zurück: Zeit-Trigger wird nicht initialisiert und feuert nicht, außer wenn er zu einem anderen Zeitpunkt im Prozess initialisiert wird. Skript zu Beginn verwendet trigger.setDueTime(<Long>), um den Trigger zu initialisieren. Der Zeitpunkt des Feuerns wird anhand des Ausgangsdatums berechnet (d. h. des Zeitstempels, zu dem das Ticket in den Bereich gelaufen ist). Der <Long>-Wert in Millisekunden wird addiert, d. h. die Methode setDueTime()verwendet die Zeit in Bezug auf die Zeit der Trigger-Initialisierung. Um eine bestimmte Zeit festzulegen, können Sie ein DATE-Objekt verwenden, das das Zieldatum / die Deadline und folgende Code-Zeile enthält: trigger.setDueTime(target.time - (new Date()).time) Wenn die Checkbox Kalender markiert ist, wird der Kalender berücksichtigt. |
Ticket befindet sich noch in dem Bereich, an dem der Zeit-Trigger hängt |
Ein Skript im Workflow ruft die Methode workflowApi.reinitializeTrigger() auf |
reinitializeTrigger(<TriggerName>) wird aufgerufen: Der Trigger wird wieder gestartet und verwendet dazu den Zeitstempel, zu dem das Ticket in den Bereich gelaufen ist (an den der Trigger angehängt ist). reinitializeTrigger(<TriggerName>,<newBaseDate>) wird aufgerufen: Der Trigger wird neu gestartet, die Zeitmessung beginnt mit newBaseDate. Wenn Sie zum Beispiel „jetzt“ als newBaseDate verwenden möchten, müssen Sie workflowApi.reinitializeTrigger("TIMER_NAME", new Date()) aufrufen. Für a und b) : Wenn die Checkbox Kalender markiert ist, wird der Kalender berücksichtigt. |
Zeit-Trigger hat gefeuert |
Skript nach Ablauf wird ausgeführt |
Das gesamte Skript wird ausgeführt. Danach gilt Folgendes: Skript nach Ablauf gibt false zurück: Es passiert nichts. Eine mit dem Trigger verknüpfte automatische Aktivität wird nicht ausgeführt. Skript nach Ablauf gibt true zurück: Eine mit dem Trigger verknüpfte automatische Aktivität wird ausgeführt. |
Siehe auch Abschnitt Verwenden der richtigen Komponenten mit Zeit-Triggern.
Beispiele für Skripte für Zeit-Trigger
Beispiel 1: Setzen einer queue-abhängigen Ablaufzeit
Diese Skript könnte beim Start der Zeitmessung für einen Zeit-Trigger an einem Bereich verwendet werden. Es initialisiert den Trigger für eine Eskalation entsprechend der Queue, d. h. wenn sich das Ticket in der Queue HelpDesk_1st_Level befindet, erfolgt die Eskalation schneller als in der Queue HelpDesk_2nd_Level.
Innerhalb der Skripte Skript zu Beginn und Skript nach Ablauf existiert das Objekt trigger als implizite Initialisierung von TimerTrigger. Sie können also direkt mit dem Trigger arbeiten, ohne vorher zusätzliche Schritte durchführen zu müssen. In einem Admin-Tool-Skript müssen Sie allerdings die Klasse TimerTrigger oder das entsprechende Java-Paket vorher importieren.
Das folgende Skript kann in einer Servicedesk- und Helpdesk-Umgebung verwendet werden und an den folgenden TimerTrigger angehängt werden.
Abbildung 78: ConSol CM Process Designer - TimerTrigger im ServiceDesk-Workflow
def addedEscalMillis = 0
switch (ticket.queue.name) {
case "HelpDesk_1st_Level":
addedEscalMillis = 12*60*60*1000L;
break;
case "HelpDesk_2nd_Level":
addedEscalMillis = 24*60*60*1000L;
break;
case "ServiceDesk":
addedEscalMillis = 4*60*60*1000L;
}
trigger.setDueTime(addedEscalMillis)
Code-Beispiel 8: Beispiel für ein Skript zu Beginn
Für dieses Beispiel ist es sinnvoll, statische Werte für die Zeiten direkt im Skriptcode anzugeben. In echten Umgebungen empfiehlt es sich, die Eskalationszeiten und dergleichen in System-Properties zu speichern und über configurationService abzurufen. Auf diese Weise kann ein Administrator einfach auf die Eskalationszeiten zugreifen und diese ändern, ohne die Workflow-Implementierung verändern zu müssen.
Im Arbeitsalltag würde vielleicht auch ein Arbeitszeitkalender verwendet werden, siehe Beispiel 2.
In der Datei server.log sehen Sie die Zeit, zu der der Trigger feuern soll.
2017-03-02 13:22:25,979 INFO [w.DefaultWorkflowEventListener] [Susan-] Ticket's 100332-001 timer defaultScope/Service_Desk/TimeTriggerDesiredDeadline was activated with escalation time Thu Mar 02 17:22:25 CET 2017
Das Ticket wurde am 2. März 2017 um 13:22 erstellt, daher liegt die Eskalationszeit vier Stunden später um 17:22.
Das gleiche Prinzip wird angewendet, um die Eskalationszeit abhängig von der Ticketpriorität, dem VIP-Status des Kunden oder einem anderen Parameter zu berechnen.
Beispiel 2: Eskalation 4 Stunden vor der Deadline berechnen
Im Ticket kann eine Deadline ausgewählt werden (Ticketfeld des Typs Datum). Vier Stunden bevor diese Deadline erreicht wird, soll das Ticket in den Eskalationsstatus überführt werden (Markierung mit einem Overlay).
def deadl = ticket.get("serviceDesk_fields.desiredDeadline")
if (deadl == null){
log.info("No deadline set!")
} else {
log.info """DEADL: ${deadl}: ${deadl.time}"""
// 4hrs before deadline the escalation should be set
// business calendar should be used
// ServiceDeskCalendar is assigned to queue ServiceDesk, this is transparent here
def now = new Date()
log.info """NOW: ${now}: ${now.time}"""
// time required in millisecds
def four_hours = -4*60*60*1000L
// calculate escalation date
def escalDate = BusinessCalendarUtil.getBusinessTime(deadl, four_hours, ticket.queue.calendar)
// calculate and set due time
log.info """escalDate: ${escalDate}: ${escalDate.time}"""
def dueTime = escalDate.time - now.time
trigger.setDueTime(dueTime)
log.info 'DUE TIME is now ' + dueTime
}
Code-Beispiel 9: Zeit für TimerTrigger mit BusinessCalendar berechnen und setzen
Beispielausgabe in der Datei server.log: