Mit dem Task Execution Framework (TEF) kann ConSol CM verschiedene Tasks ausführen, die nicht direkt mit einem anderen Skript (wie einem Workflow-Skript, einer Unit-Aktion, einer Ressourcenaktion, einer Suche-Aktion oder einer anderen Art von Admin-Tool-Skript) verbunden sind bzw. nicht in einem anderen Skript eingebettet sind, und die asynchron ausgeführt werden können. Es kann zum Beispiel für lang dauernde System-Tasks verwendet werden, die ein Timeout hervorrufen würden, wenn sie innerhalb eines regulären ConSol CM-Skripts gestartet würden. Die TEF-Tasks können asynchron ausgeführt werden. In Version 6.9.4.0 erhielt ConSol CM eine neue API mit TEF-Erweiterungen. TEF-Skripte können folgendermaßen gestartet werden (d. h. die TEF-API ist dort verfügbar):
Ein Task wird als Admin-Tool-Skript des Typs Task gespeichert (siehe Admin-Tool-Skripte). Dieser Skripttyp wird im nachfolgenden Abschnitt beschrieben.
Abbildung 359: ConSol CM Task Execution Framework
Der Task Executor ist ein ConSol CM-Modul (ein Singleton mit Watchdog-Funktionen), das die Task-Ausführung steuert. Der Task Executor durchsucht die Datenbank nach neuen geplanten Tasks und verwendet einen Thread-Pool für die Ausführung der Tasks, die zu einem bestimmten Zeitpunkt ausgeführt werden müssen.
Die Task-Definition ist in einem Admin-Tool-Skript gespeichert. Für die Definition eines Tasks wird also normalerweise ein Admin-Tool-Skript verwendet.
Ein (geplanter) Task, d. h. eine einzige Ausführung des Tasks, kann folgendermaßen gestartet werden:
In den Skripten ist für jede Ausführung eines Tasks der sogenannte Task Descriptor, d. h. ein Objekt der Klasse TaskDescriptor, verfügbar. Dieser Task Descriptor liefert Informationen wie den Fortschritt des Tasks oder die Startzeit der Ausführung. Mit dem Task Descriptor wird ein neu definierter Task entweder sofort ausgeführt oder für einen späteren Ausführungszeitpunkt geplant. Dies kann in Skripten angewendet werden. Details zur Programmierung finden Sie im Abschnitt Programmierung mit Tasks.
Jedes Admin-Tool-Skript des Typs Task muss folgende Methoden implementieren. Die Methodensignaturen werden automatisch bei der Erstellung eines derartigen Skripts eingefügt.
def onInitialize(taskDescriptor) {}
def onExecute(taskDescriptor) {}
def onError(taskDescriptor) {}
def onCancel(taskDescriptor) {}
//Test
def onInitialize(taskDescriptor) {
log.info("MyFirstTaskScript has been initialized!")
}
def onExecute(taskDescriptor) {
log.info("MyFirstTaskScript is executed")
try {
Thread.Sleep(300000)
} catch (Exception ex) {
log.info("ztztzt ...")
}
}
def onError(taskDescriptor) {
log.info("MyFirstTaskScript has thrown an error!")
}
def onCancel(taskDescriptor) {
log.info("MyFirstTaskScript has been cancelled!")
}
Code-Beispiel 53: Beispiel für ein Admin-Tool-Skript des Typs Task
Sie können die Tasks, die zuvor als Admin-Tool-Skripte definiert wurden, im Admin Tool in der Navigationsgruppe Dienste, Navigationselement Task-Ausführung starten.
Damit die Tasks ausgeführt werden können, muss die System-Property start.groovy.task.enabled im Modul cmas-app-admin-tool auf true gesetzt sein. Diese Property ist in einer Standardinstallation nicht vorhanden und muss manuell hinzugefügt werden.
Bedenken Sie, dass Sie absolut sicher sein müssen, was die ausgeführten Tasks machen, wenn Sie die System-Property start.groovy.task.enabled im Modul cmas-app-admin-tool auf true setzen, sodass Sie als Administrator Tasks ausführen können! Seien Sie sich des Risikos bewusst, das Tasks darstellen können, die zum Beispiel Kundendaten oder Tickets löschen und nur durch ein Workflow- oder Admin-Tool-Skript ausgeführt werden sollten.
Abbildung 360: ConSol CM Admin Tool - Admin-Tool-Task
Um ein Skript zu starten, klicken Sie auf den Button Start und wählen Sie den Namen des Admin-Tool-Skripts im Drop-down-Menü Statisches Skript. Hier sind alle Admin-Tool-Skripte des Typs Task aufgeführt. Klicken Sie auf Start, um das Skript sofort auszuführen. Es ist nicht möglich, einen Task über die GUI des Admin Tools zu planen. Wenn der Start verzögert werden soll, muss dies innerhalb des Skripts implementiert werden, siehe Definieren des (ersten) Ausführungsdatums.
Wenn ein Task ausgeführt wird, wird ein Fortschrittsbalken angezeigt. Sie können den Task über den Button Stop anhalten (abbrechen).
Abbildung 361: ConSol CM Admin Tool - Ausführen von Task im Admin Tool
In der aktuellen ConSol CM-Version steht ein Task-Typ zur Verfügung, der Groovy-Task mit einem statischen Skript. Dies bezieht sich auf das Admin-Tool-Skript, mit dem der Task definiert wird, siehe vorherigen Abschnitt.
Der Task Execution Service (Groovy-Klasse TaskExecutionService, ein Singleton) läuft im Hintergrund und durchsucht die ConSol CM-Datenbank nach Tasks (Datenbank-Tabelle cmas_task_descriptor) mit dem Status INITIALIZED. Wie alle ConSol CM-Dienste ist er implizit als Objekt mit dem Namen taskExecutionService (siehe folgende Beispiele) verfügbar. Wenn die Startzeit des Tasks erreicht wurde, wird der Task gestartet.
Alle Parameter für den neuen Task müssen mit dem Task Descriptor (Groovy-Klasse TaskDescriptor) gesetzt werden, z. B. das Startdatum des Tasks. Der Task Descriptor liefert zudem Informationen über den laufenden Task, wie seinen Fortschritt.
Abbildung 362: Einige TEF-Groovy-Klassen
GroovyTask groovyTask = new GroovyTask();
groovyTask.setStaticScript(scriptSourceService.getByName("someATScript.groovy"));
taskDescriptor = taskExecutionService.schedule(groovyTask, "task");
Code-Beispiel 54: Erstellen eines Task Descriptors
Teil 1: Erstellen Sie den Task Descriptor und speichern Sie die ID.
GroovyTask groovyTask = new GroovyTask();
groovyTask.setStaticScript(scriptSourceService.getByName("someATScript.groovy"));
taskDescriptor = taskExecutionService.schedule(groovyTask, "task");
def myTaskDescriptorId = groovyTask.getId()
//save this Id wherever it will be needed, e.g., in a different script which might be used to kill the task
Code-Beispiel 55: Abbrechen eines Tasks
Teil 2: Möglicherweise während der Ausführung des Tasks verwendet.
taskExecutionService.cancel(myTaskDescriptorId)
Wenn Sie nach der Ausführung eines Tasks ein anderes Ausführungsdatum setzen, wird der Task neu geplant. Dies erfolgt, wie hier gezeigt, innerhalb des Admin-Tool-Task-Skripts.
def onInitialize(taskDescriptor) {}
def onExecute(taskDescriptor) {
//some code to execute
...........................
//here, we set the new future execution date for the task, we also need to return a special steering object
taskDescriptor.setExecutionDate(new Date(new Date().getTime() + 15000));
return new ExecutionSpecification().setRetryRequested(true);
}
def onError(taskDescriptor) {}
def onCancel(taskDescriptor) {}
Code-Beispiel 56: Wiederholen eines Tasks
Für ein Skript, das nicht sofort gestartet werden soll, können Sie die Startzeit in der Methode onInitialize() definieren.
def onInitialize(taskDescriptor) {
taskDescriptor.setExecutionDate(yourDate)
}
Code-Beispiel 57: Planen eines Tasks
def onInitialize(taskDescriptor) {}
def onExecute(taskDescriptor) {}
def onError(taskDescriptor) {
return new ExecutionSpecification().setRetryRequested(true);
// this will reschedule the task for immediate re-execution, in case a future date is needed, this can be set as explained in the example above
def onCancel(taskDescriptor) {}
Code-Beispiel 58: Wiederholen eines Tasks nach einem Fehler
Mit ContextReference können Sie feststellen, in welchem Kontext ein Skript aufgerufen wurde. So kann es zum Beispiel erforderlich sein, dass ein TEF-Skript sich unterschiedlich verhält, je nachdem, ob es aus dem Workflow-Skript einer bestimmten Aktivität aufgerufen wurde oder im Prozess einer anderen Aktivität. In solchen Fällen hilft Ihnen die ContextReference dabei, Rückschlüsse auf das Workflow-Skript zu ziehen, aus dem das TEF-Skript aufgerufen wurde. Sie setzen einfach in jedem Workflow-Skript eine andere ContextReference (ein einfacher String als Bezeichner). Dann können Sie die ContextReference im Task abrufen und der Task weiß, von wo er aufgerufen wurde.
Verwenden Sie folgende Methoden:
Siehe auch Beispiel 2 unten.
In diesem Beispiel wird ein Task-Skript mit einer Workflow-Aktivität ausgeführt. Es wird keine Verzögerung gesetzt, d. h. der Task wird sofort ausgeführt, wenn der Bearbeiter die Workflow-Aktivität im Web Client ausführt. Das Skript kann dann im Hintergrund laufen und der Bearbeiter sieht die Ergebnisse (wie die neuen Ticketeinträge oder die neuen Kundendaten) erst, wenn das Skript fertig ist. Ein Aktion des Bearbeiters ist zwischen dem Start und dem Ende der Skriptausführung nicht erforderlich.
Abbildung 363: ConSol CM Web Client - Workflow-Aktivität für Task-Ausführung
Abbildung 364: ConSol CM Process Designer - Workflow-Aktivität für Task-Ausführung
def myNewTask = new GroovyTask()
myNewTask.setStaticScript(scriptSourceService.getByName("MyFirstTaskScript"))
def myTaskDescriptor = taskExecutionService.schedule(myNewTask, "myTaskGroup")
myTaskDescriptor.setExecutionDate(new Date())
Code-Beispiel 59: Workflow-Aktivitätsskript für Task-Ausführung
2015-02-20 11:54:24,742 INFO [rver.service.task.TaskExecutor] [task-executor-task-executor:10.0.6.200:0-] Task Executor task-executor:10.0.6.200:0 is executing task: TaskDesc-02-20 11:54:19.0, transactionTimeout (sec)=0, type=class com.consol.cmas.common.model.task.GroovyTask}
2015-02-20 11:54:24,747 INFO [ database_MyFirstTaskScript] [task-executor-task-executor:10.0.6.200:0-] MyFirstTaskScript is executed
2015-02-20 11:54:24,747 INFO [ database_MyFirstTaskScript] [task-executor-task-executor:10.0.6.200:0-] ztztzt ...
2015-02-20 11:54:24,748 INFO [rver.service.task.TaskExecutor] [task-executor-task-executor:10.0.6.200:0-] Task execution successful removing task : TaskDescriptor{group='myT, transactionTimeout (sec)=0, type=class com.consol.cmas.common.model.task.GroovyTask}
Das Task-Skript (Admin-Tool-Skript des Typs Task) zeigt die ContextReference an, aus der es aufgerufen wurde.
Abbildung 365: ConSol CM Admin Tool - Admin Tool-Skript für einen TEF-Task
In anderen Workflow-Aktivitäten werden andere ContextReferences als eindeutige IDs gesetzt. Wenn das TEF-Skript aufgerufen wird, wird (in der Log-Ausgabe) immer die ContextReference der aufrufenden Workflow-Aktivität angezeigt.
Abbildung 366: Workflow-Aktivitäten und Log-Ausgabe, wenn eine der Aktivitäten das TEF-Skript aufgerufen hat
Modul | Parameter | Standardwert | Beschreibung |
---|---|---|---|
|
|
false |
Aktiviert den Button zum Starten des Tasks im Admin Tool |
|
|
60 |
Setzt den Timeout für den Task Execution Service des TEF, d. h. ein Durchlauf eines Tasks muss vor dem Ablauf dieser Zeitspanne abgeschlossen sein. |
|
|
1 |
Größe des Thread-Pools, d. h. Anzahl der parallel ausgeführten Tasks |
|
|
5 |
Wartezeit zwischen der Ausführung von zwei Tasks |