Massendaten im Prozess verarbeiten
Problemstellung
In einem serverseitigen Prozess-Skript soll eine größere Anzahl von Daten (> 10.000) neu angelegt werden. Damit alle Serverlogiken bei der Neuanlage regulär auf die neuen Datensätze angewendet werden, wird jeder Datensatz über den Aufruf der Methode WorkSpaceScriptUtils.createEntry()
erzeugt. Diese Methode wird aber mit steigender Anzahl der angelegten bzw. geänderten Datensätze immer langsamer. Dieses Problem kommt durch die Transaktionsverwaltung des Applikationsservers.
Das folgende Skript versucht nun 100.000 Aktivitäten anzulegen. Durch die Transaktionsperformanz ist es nicht möglich den Prozess innerhalb von 24h abzuschließen, wodurch die Ausführung mit Fehlern abgebrochen wird.
100.000 Aktivitäten in einem Skript anlegen
IScriptWorkSpace acWs = WorkSpaceScriptUtils.createEmptyWorkSpace("Activity")
for(int i = 0; i < 100000; i++) {
String subject = "Akt100000 " + i
IContainer ac = WorkSpaceScriptUtils.createDefaultEntry("Activity");
WorkSpaceScriptUtils.setValue(ac, "Subject.Activity", subject)
WorkSpaceScriptUtils.setValue(ac, "StartDate.Activity", DateUtils.NOW)
...
WorkSpaceScriptUtils.createEntry(acWs, 0, ac)
}
Prozess-Schleife und Transaktionsunterbrechung
Ein oft verwendeter Lösungsansatz ist die Aufteilung der Neuanlage in z.B. 100 Pakete mit jeweils 1000 Datensätzen.
![](../../../__attachments/8094551/CRM-2794_process_loop_fail.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
Diese Lösung verwendet zwar immer nur einen kleineren IScriptWorkSpace bleibt aber in einer Transaktion. Zudem wird die Prozessausführung in der Schleife nicht unterbrochen, was zu einem StackOverflowError in der JVM führen wird!
Damit die Neuanlage für jedes Paket mit derselben Performanz läuft, muss die Transaktion unterbrochen werden. Generell gilt, dass Massendaten-Prozesse immer auf einer asynchronen Prozessausführung basieren sollten, da der Aufrufer des Prozesses nicht auf das Ende aktiv warten will. Die korrekte Lösung unterbricht die Schleife durch das Transaktionsunterbrechende Zwischenereignis:
![](../../../__attachments/8094551/CRM-2794_process_loop_transaction.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
Die Transaktionsunterbrechung stellte die gleichbleibend performante und fehlerfreie Ausführung der Neuanlage sicher und informiert den Aufrufer erst am Ende des Prozesses über das Ergebnis. Mit diesem Ansatz können auch größere Datenmengen verarbeitet werden.
![](../../../__attachments/8094551/MassDataTask-res-bpm-Cells-48x48.png?inst-v=01ce9f95-f40d-424e-a7da-0f3a4bad5824)
Für eine schnelle Verarbeitung von Massendaten, die keinerlei sonstige Serverlogik benötigen, eignet sich dieser Ansatz aber nicht. Für eine Unterbrechungsfreie Verarbeitung von Massendaten mit Einzeltransaktionen sollten im Prozess die Massendatenaktionen, ausgelagert auf dem Massendatenserver, eingesetzt werden.