Error Handling
Funktionsbeschreibung
Für jeden Prozess kann ein weiterer Prozess zur Behandlung von Fehlern definiert werden, der sogenannte Fehlerbehandlungsprozess.
Im Falle eines Fehlers startet dieser Fehlerbehandlungsprozess automatisch, sofern der Fehler nicht durch ein Error Boundary Event bereits behandelt wurde.
Der Fehlerbehandlungsprozess bekommt sämtliche zur Fehlerbehandlung benötigten Daten aus dem Hauptprozess per Start Token übergeben (siehe hier).
Für diesen Fehlerbehandlungsprozess kann ein Service Task definiert werden, der den fehlerhaften Hauptprozess neustartet (retry).
Hierzu muss dem Retry Service Task die Custom Property engine.setServiceTaskType mit dem Wert RetryProcess zugewiesen werden.
Des Weiteren muss im PreScript definiert werden, welche Prozessinstanz neugestartet werden soll (processInstanceIdToRetry). Für den Neustart können die Daten des Start Tokens geändert werden (newToken).
Der Prozess wird standardmäßig an der fehlerhaften Flow Node neugestartet.
Im Falle eines Fehlers im Parallel Gateway wird das gesamte Gateway neugestartet.
Sollten mehrere Fehler in einem Parallel Gateway ausgelöst werden, so wird der Fehlerbehandlungsprozess nur einmal gestartet.
Beispiel Start Token Fehlerbehandlungsprozess
{
"processInstanceIdWithError": "e7e27de1-8fe6-4a44-ae2a-979f578fde67",
"error": {
"name": "Error",
"message": "Failure in process: Fehler",
"stack": "Error: Failure in process: Fehler at vm.js:2:7 at vm.js:5:13 at Script.runInContext (node:vm:141:12) ...",
"category": "process"
},
"flowNodeInstances": [
{
"flowNodeInstanceId": "a2d745ff-0107-4f1a-971d-8b77a5365ec3",
"flowNodeId": "ScriptTask11",
"flowNodeName": "Error",
"flowNodeLane": "Lane",
"flowNodeType": "bpmn:ScriptTask",
"state": "error",
"previousFlowNodeInstanceId": "6d6ce497-1b1c-4278-ae7b-b999c859e7d6",
"parentProcessInstanceId": null,
"processDefinitionId": "gc134dccc-bf23-4751-a9f2-ffc82a7eca66_Definition",
"processModelId": "ge8cdbcfe-9d34-424e-a6bf-8d382a79dc0e_Process",
"processInstanceId": "e7e27de1-8fe6-4a44-ae2a-979f578fde67",
"correlationId": "52a18e0e-73ab-46b0-a06b-7bc482a3cd3f",
"ownerId": "dummy_token",
"startToken": {
"raise": true,
"number": 11
},
"endToken": {
"raise": true,
"number": 11
},
"tokens": [
{
"flowNodeInstanceId": "a2d745ff-0107-4f1a-971d-8b77a5365ec3",
"type": "onEnter",
"payload": {
"raise": true,
"number": 11
}
},
{
"flowNodeInstanceId": "a2d745ff-0107-4f1a-971d-8b77a5365ec3",
"type": "onExit",
"payload": {
"raise": true,
"number": 11
}
}
],
"error": {
"name": "Error"
},
"startedAt": "2023-07-10T09:59:45.062Z",
"finishedAt": "2023-07-10T09:59:45.080Z"
},
{
"flowNodeInstanceId": "286f98ff-2e7c-40ec-8dad-67d161a448ae",
"flowNodeId": "Event_12ttnn3",
"flowNodeName": null,
"flowNodeLane": "Lane",
"flowNodeType": "bpmn:BoundaryEvent",
"eventType": "errorEvent",
"state": "canceled",
"previousFlowNodeInstanceId": "a2d745ff-0107-4f1a-971d-8b77a5365ec3",
"parentProcessInstanceId": null,
"processDefinitionId": "gc134dccc-bf23-4751-a9f2-ffc82a7eca66_Definition",
"processModelId": "ge8cdbcfe-9d34-424e-a6bf-8d382a79dc0e_Process",
"processInstanceId": "e7e27de1-8fe6-4a44-ae2a-979f578fde67",
"correlationId": "52a18e0e-73ab-46b0-a06b-7bc482a3cd3f",
"ownerId": "dummy_token",
"startToken": {
"raise": true,
"number": 11
},
"endToken": {
"raise": true,
"number": 11
},
"tokens": [
{
"flowNodeInstanceId": "286f98ff-2e7c-40ec-8dad-67d161a448ae",
"type": "onEnter",
"payload": {
"raise": true,
"number": 11
}
},
{
"flowNodeInstanceId": "286f98ff-2e7c-40ec-8dad-67d161a448ae",
"type": "onExit",
"payload": {
"raise": true,
"number": 11
}
}
],
"error": null,
"startedAt": "2023-07-10T09:59:45.061Z",
"finishedAt": "2023-07-10T09:59:45.086Z"
},
{
"eventName": "",
"triggerValue": null,
"flowNodeInstanceId": "6d6ce497-1b1c-4278-ae7b-b999c859e7d6",
"flowNodeId": "StartEvent_1",
"flowNodeName": "Start",
"flowNodeLane": "Lane",
"flowNodeType": "bpmn:StartEvent",
"state": "finished",
"previousFlowNodeInstanceId": null,
"parentProcessInstanceId": null,
"processDefinitionId": "gc134dccc-bf23-4751-a9f2-ffc82a7eca66_Definition",
"processModelId": "ge8cdbcfe-9d34-424e-a6bf-8d382a79dc0e_Process",
"processInstanceId": "e7e27de1-8fe6-4a44-ae2a-979f578fde67",
"correlationId": "52a18e0e-73ab-46b0-a06b-7bc482a3cd3f",
"ownerId": "dummy_token",
"startToken": {},
"endToken": {
"raise": true,
"number": 11
},
"tokens": [
{
"flowNodeInstanceId": "6d6ce497-1b1c-4278-ae7b-b999c859e7d6",
"type": "onEnter",
"payload": {}
},
{
"flowNodeInstanceId": "6d6ce497-1b1c-4278-ae7b-b999c859e7d6",
"type": "onExit",
"payload": {
"raise": true,
"number": 11
}
}
],
"error": null,
"startedAt": "2023-07-10T09:59:45.045Z",
"finishedAt": "2023-07-10T09:59:45.049Z"
}
],
"dataObjects": {
"TestData": {
"Test1": 1
}
},
"flowNodeWithError": {
"flowNodeInstanceId": "a2d745ff-0107-4f1a-971d-8b77a5365ec3",
"startToken": {
"raise": true,
"number": 11
}
},
"processStartEventWithError": {
"flowNodeInstanceId": "6d6ce497-1b1c-4278-ae7b-b999c859e7d6",
"startToken": {}
}
}Neustart des Prozesses definieren
Die Angaben im PreScript können durch einen optionalen Parameter ergänzt werden.
Es kann entweder durch den Parameter flowNodeInstanceIdToRetry oder durch den Parameter flowNodeIdToRetry (ElementId im Studio) definiert werden, bei welcher Flow Node neugestartet (retry) werden soll.
Wurde kein Parameter definiert, so wird standardmäßig die fehlerhafte Flow Node neugestartet.
PreScript für das wiederholte Starten der fehlerhaften Flow Node (default)
{
processInstanceIdToRetry: `${dataObjects.StartData.processInstanceIdWithError}`,
newToken: {
...dataObjects.StartData.processStartEventWithError.startToken,
raise: false
}
}PreScript für das wiederholte Starten per FlowNodeInstanceId
{
processInstanceIdToRetry: `${dataObjects.StartData.processInstanceIdWithError}`,
flowNodeInstanceIdToRetry: `${dataObjects.StartData.processStartEventWithError.flowNodeInstanceId}`,
newToken: {
...dataObjects.StartData.processStartEventWithError.startToken,
raise: false
}
}PreScript für das wiederholte Starten per FlowNodeId/ElementId
{
processInstanceIdToRetry: `${dataObjects.StartData.processInstanceIdWithError}`,
flowNodeIdToRetry: "StartEvent",
newToken: {
...dataObjects.StartData.processStartEventWithError.startToken,
raise: false
}
}Abhängigkeiten
Für diese Engine-Extension wird die gleichnamige Studio-Extension error_handling benötigt!
Die Studio-Erweiterung custom_service_tasks enthält für diese Erweiterung ein zusätzliches Formular zur
erleichterten Eingabe der benötigten Parameter.