Durchsuchbare Dokumentation aufrufen | Zurück zur Dokumentationsübersicht
Navigation: Dokumentationen agorum core > agorum core für Entwickler > agorum core JavaScript-API
Diese Bibliothek bietet Funktionen zum Ablaufen von Modifikationen in Transaktionen.
Beispiel: agorum core schickt Daten per API an DATEV oder an eine andere Schnittstelle. Tauchen währenddessen im Workflow oder im ausführenden Skript Fehler auf, rollt agorum core die Transaktion zwar zurück, das Fremdsystem jedoch nicht. Das kann dazu führen, dass doppelt oder falsch gebucht wird. Planen Sie den Prozess so, dass diese Fehler nicht in der gleichen Transaktion stattfinden, oder entwickeln Sie ein Konzept, um der API mitzuteilen, dass die Daten ungültig sind.
Binden Sie die Bibliothek stets am Anfang eines Skripts ein:
let transaction = require('common/transaction');
transaction(timeout, (t) => callback(t));
Parameter | Beschreibung | Standard |
---|---|---|
timeout | Definiert in Sekunden, wie lange die Transaktion maximal dauern darf. Wenn diese Zeit abgelaufen ist, wird die Transaktion abgebrochen und es wird ein Rollback ausgeführt. |
-1 (Timeout wird nicht berücksichtigt, die Transaktion kann beliebig lange laufen.) |
callback | Definiert die zu übergebene Funktion, die innerhalb der Transaktion ausgeführt wird.
Folgende Funktionen bietet der Parameter t an: |
– |
Allgemein mit Timeout in Sekunden
let obj = require('common/objects'), transaction = require('common/transaction'); let timeout = 300; // Maximal 5 Minuten transaction(timeout, t => { // Everything that takes place here is performed within a single transaction. });
Allgemein ohne Timeout
Der Timeout wird auf den Standard -1 gesetzt.
let transaction = require('common/transaction'); transaction(t => { // Everything that takes place here is performed within a single transaction. });
Nachfolgendes Beispiel zeigt eine Iteration über alle Objekte, bei der der Name eines jeden gefundenen Objekts umgesetzt wird. Es werden immer 50 Objekte in einer Transaktion umgesetzt.
let obj = require('common/objects'); let transaction = require('common/transaction'); function forEach(query, threshold, callback) { transaction(t => { let c = 0; obj.query(query).forEach(object => { if (++c > threshold) { t.restart(); c = 0; } callback(object); }); }); } let ret = []; forEach('name:("Dokumente" NOT "Sonstige_Dokumente") area:(Vorgangsdokumente NOT "Vorgangsdokumente - Ablage")', 50, object => { object.name = "Sonstige_Dokumente"; ret.push(object.ID); }); ret;
Nachfolgendes Beispiel zeigt, wie jede Änderung innerhalb einer Schleife als einzelne Transaktion durchgeführt wird.
// Delete DocumentTextObjects // Unten in den Aufruf: clear(..) das entsprechende Suchmuster einstellen. let IndexHelper = Packages.agorum.roi.searchengine.IndexHelper; let MessageUtils = Packages.agorum.roi.ejb.messaging.common.MessageUtils; let MessageBean = Packages.agorum.roi.ejb.messaging.common.MessageBean; let objects = require('common/objects'); let transaction = require('common/transaction'); function clear(query) { let count = 0; let mu = new MessageUtils(); objects.query(query).forEach(object => { transaction(() => { IndexHelper.disableRealtimeIndex(); object.deleteDocumentText(); let mb = new MessageBean(); mb.setObjectProperty('value', new java.lang.Long(object.getId())); mb.setObjectProperty('eventType', 'updateObjectListener'); mb.setObjectProperty('className', object.className); mb.setObjectProperty('NoEventAssistanceObject', ''); mu.publishToTopic('updateObjectListener', mb, true); ++count; }); }); return count; } clear('nameextension:(html OR htm OR txt OR json OR xml)');
Nachfolgendes Beispiel zeigt, wie Sie eine Transaktion nach einer gewissen Zeit und nicht nach x Durchgängen neu starten.
let transaction = require('common/transaction'); // Definiere die Abbruchfunktion // nach x Sekunden wird der übergebene callback ausgeführt let periodic = (period, fn) => { let next = Date.now() + period; return () => { if (Date.now() > next) { fn(); next = Date.now() + period; } }; }; transaction(t => { // ... // Define exact function; in this case, a flush to a log file is also performed with every transaction restart // The interval is set to 30 seconds let auto = periodic(30 * 1000, () => { ow.flush(); t.restart(); }); // For example, a loop or forEach // In this loop, it is regularly checked whether the time is up and it needs to be executed again while (...) { // ... auto(); // ... } });
Nachfolgendes Beispiel zeigt, wie Sie eine Transaktion zurückrollen.
transaction(t => { // Everything that takes place here is performed within a single transaction. throw new Error('Transaktion beenden und Rollback machen'); });