FlowAPI: Bereichsbezogen, global
Die FlowAPI bietet Methoden zum Ausführen von Aktionen, Flows oder Subflows in serverseitigen Skripts mit blockierenden oder nicht blockierenden Methoden.
Greifen Sie mit dem Namespace sn_fd auf FlowAPI -Methoden in globalen und bereichsbezogenen Skripts zu. Erstellen Sie Aufrufe für Ihre Flows mithilfe der Codeausschnittaktion in Workflow-Studio, oder verwenden Sie die hier beschriebenen Methoden, um Skripts manuell zu aktualisieren.
FlowAPI – Abbrechen (Zeichenfolge-Kontext-ID, Zeichenfolgengrund)
Bricht einen angehaltenen oder ausgeführten Flow, Subflow oder eine Aktion ab.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Sys_id des Ausführungsdetail-Datensatzes für den Flow, Subflow oder die Aktion. Greifen Sie auf die Ausführungsdetails zu, indem Sie zur Registerkarte Flow-Ausführungen in Workflow-Studionavigieren, oder übergeben Sie die sys_id des Kontextdatensatzes, der von den Methoden startFlow(), startSubflow()oder startAction() zurückgegeben wird. Hinweis: Der Abbruch kann zu einer geringfügigen Verzögerung führen, wenn der Zielkontext auf einem anderen Knoten der Instanz ausgeführt wird. Auf demselben Knoten ausgeführte Kontexte werden sofort abgebrochen. Kontexte, die auf einem anderen Knoten ausgeführt werden, müssen zuerst warten, bis der Abbruch an den entsprechenden Knoten weitergeleitet wird. |
| Grund | Zeichenfolge | Optional. Grund für den Abbruch des Flows, Subflows oder der Aktion. Wird im Feld Nachricht der Tabelle „Flow-Engine-Protokolleinträge“ [sys_flow_log] angezeigt. |
| Typ | Beschreibung |
|---|---|
| void |
In diesem Beispiel wird der Rückgabewert der startFlow()- Methode verwendet, um lang laufende Flows abzubrechen.
(function() {
var now_GR = new GlideRecord('incident');
now_GR.addQuery('number', 'INC0000050');
now_GR.query();
now_GR.next();
try {
var inputs = {};
inputs['current'] = now_GR; // GlideRecord of table:
inputs['table_name'] = 'incident';
// Starts the flow asynchronously.
var result = sn_fd.FlowAPI.getRunner()
.flow('global.myFlow')
.inBackground()
.withInputs(inputs)
.run();
var contextId = result.getContextId();
var dateRun = result.getDate();
var domainUsed = result.getDomainId();
var flowName = result.getFlowObjectName();
var flowObjectType = result.getFlowObjectType();
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
// Call the cancel() method using the context Id returned from the startFlow() method
sn_fd.FlowAPI.cancel(contextId, 'Flow took too long to execute.');
In diesem Beispiel werden Flows mit dem Namen Test-Flow abgebrochen.
var now_GR = new GlideRecord("sys_flow_context");
now_GR.addQuery("name", "Test Flow");
now_GR.query();
while (now_GR.next()) {
sn_fd.FlowAPI.cancel(now_GR.getUniqueValue(), 'Canceling Test Flows');
}
FlowAPI – executeAction(String name, Map inputs, Number timeout)
Führt eine Aktion synchron über ein serverseitiges Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name der auszuführenden Aktion, z. B. global.action_name. |
| inputs | Karte | Name-Wert-Paare, die Aktionseingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| Objekt | Die Aktionsausgaben. |
In diesem Beispiel verwendet das Skript sn_fd.FlowAPI.executeAction, um im globalen Bereich eine Aktion namens actionforpassword2test auszuführen. Eine Variable mit dem Namen „inputs“ enthält die Eingänge für die Aktion. In diesem Fall einen Namen und ein Passwort. Die Ausgaben für die Aktion werden in der Variablen „outputs“ gespeichert, die in diesem Fall ein verschlüsseltes Passwortobjekt ist. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
var inputs = {};
inputs['name'] = ; // String
inputs['password2'] = ; // Password (2 Way Encrypted)
// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
// var timeout = ; //timeout in ms
//sn_fd.FlowAPI.executeAction('global.actionforpassword2test', inputs, timeout)
var outputs = sn_fd.FlowAPI.executeAction('global.actionforpassword2test', inputs);
// Get Outputs:
// Note: outputs can only be retrieved when executing synchronously.
var output = outputs['output']; // Password (2 Way Encrypted)
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI - executeActionQuick(Zeichenfolgenname, Zuordnungseingaben, Anzahl Zeitüberschreitung)
Führen Sie eine Aktion von einem serverseitigen Skript synchron aus der aktuellen Anwendersitzung aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessern Sie die Leistung, indem Sie den Aufwand für die Datensatzverwaltung eliminieren. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten der Aktion zum Warten auf Bedingungen nicht. Schritte, die für Wartebedingungen wie „Um Genehmigung bitten“ oder „Auf Bedingung warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt nicht das Anhalten einer Aktion, die über einen MID-Server ausgeführt wird.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name der auszuführenden Aktion. Beispiel: global.action_name. Suchen Sie das Feld Interner Name in der Liste der Workflow-Studio -Aktionen. |
| Eingaben | Karte | Name-Wert-Paare, die Aktionseingaben definieren. Die verfügbaren Aktionseingaben und erforderlichen Datentypen finden Sie unter Eingaben in der Aktionsgliederung. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| Objekt | Objekt mit durch die Aktion definierten Ausgaben. Sie finden die Ausgaben für die Aktion unter Ausgaben in der Aktionsgliederung. |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('57af7aec73d423002728660c4cf6a71c');
var inputs = {};
inputs['variable'] = grIncident;
var outputs = sn_fd.FlowAPI.executeActionQuick('global.update_record_test', inputs);
// Get Outputs:
// Note: outputs can only be retrieved when executing synchronously.
var output1 = outputs['output1'];
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI - executeDataStreamAction(Zeichenfolgenname, Zuordnungseingaben, Anzahl Zeitüberschreitung)
Führt eine Datenstromaktion synchron mit einem serverseitigen Skript aus und gibt ein ScriptableDataStream-Objekt zurück.
Weitere Informationen zu Datenstromaktionen finden Sie unter Datenstromaktionen und Paginierung.
Versuch/Erfassung -Block ein, um Fehler abzufangen. Fügen Sie immer eine finale Anweisung ein, die mit der Methode schließen () aus der Klasse ScriptableDataStream endet, um den Datenstrom zu schließen und Leistungsprobleme zu vermeiden.| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und Name der auszuführenden Datenstromaktion. Beispiel: global.data_stream_action_name. |
| Eingaben | Karte | Name-Wert-Paare, die Aktionseingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Wenn die Aktion keine Eingaben enthält, fügen Sie diesen Parameter nicht ein. |
| Zeitüberschreitung | Nummer | Optional. Zeitspanne, bis die Aktion abläuft. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. Die Zeitüberschreitung gilt nur für die Methode executeDataStreamAction, nicht für Methoden in der Klasse ScriptableDataStream. Standard: 30000, angegeben durch die Systemeigenschaft com.glide.hub.flow_api.default_execution_time Einheit: Millisekunden |
| Typ | Beschreibung |
|---|---|
| ScriptableDataStream | Ein Objekt, das zum Iterieren durch Elemente im Datenstrom verwendet wird. Verwenden Sie die Methoden in der Klasse „ScriptableDataStream“, um mit diesem Objekt zu interagieren. Weitere Informationen finden Sie unter ScriptableDataStream-API. |
In diesem Beispiel wird ein Incident-Datensatz für jedes im Datenstrom zurückgegebene Element erstellt.
(function() {
try {
// Execute Data Stream Action.
var stream = sn_fd.FlowAPI.executeDataStreamAction('x_my_scope.data_stream_name');
// Process each item in the data stream
while (stream.hasNext()) {
// Get a single item from the data stream.
var item = stream.next();
// Use the item.
var now_GR = new GlideRecord('incident');
now_GR.setValue('number',item.id);
now_GR.setValue('short_description',item.name);
now_GR.insert();
// By default, this code snippet will terminate after 10 items.
// Remove or modify this limit after testing your code.
if (stream.getItemIndex() >= 9) {
break;
}
}
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
} finally {
stream.close();
}
})();
FlowAPI – executeFlow(String name, Map inputs, Number timeout)
Führt einen Flow synchron aus einem serverseitigen Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name des auszuführenden Flow, z. B. global.flow_name. |
| inputs | Karte | Name-Wert-Paare, die Auslösereingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| Keine | Im Normalbetrieb wird kein Rückgabewert erzeugt. |
| Ausnahme | Die API löst eine Ausnahme aus, wenn ein synchron aufgerufener Flow angehalten wird. Die aktuelle Ausführung befindet sich im Status „Warten“. In den meisten Fällen wird die Ausnahme entfernt, wenn der Flow fortgesetzt wird. Die API kann jedoch einen Flow, der an einen MID Server gesendet wurde, nicht fortsetzen. |
Dieses Beispiel verwendet „sn_fd.FlowAPI.executeFlow“, um einen globalen Flow mit dem Namen „test_flow“ auszuführen. Dieser Flow wird normalerweise ausgelöst, wenn ein Datensatz in der Incident-Tabelle aktualisiert wird. Da Sie den Flow von einem Skript aus aktivieren, müssen Sie diese Informationen angeben. Der Code erstellt eine Variable „inputs“, die den aktuellen Datensatz und die Tabelle für den Datensatz enthält. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
var inputs = {};
inputs['current'] = ; // GlideRecord of table:
inputs['table_name'] = 'incident';
// Execute Synchronously: Run in foreground.
// var timeout = ; //timeout in ms
//sn_fd.FlowAPI.executeFlow('global.test_flow', inputs, timeout)
sn_fd.FlowAPI.executeFlow('global.test_flow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI - executeFlowQuick(Zeichenfolgenname, Zuordnungseingaben, Anzahl Zeitüberschreitung)
Führt einen Flow, einen Subflow, eine Aktion oder eine Datenstromaktion synchron oder asynchron aus einem serverseitigen Skript aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessert die Leistung, indem der Aufwand für die Datensatzverwaltung eliminiert wird. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Als Anwender ausführen
- Diese Methode führt den Flow als der Benutzer aus, der die Sitzung initiiert. Das Festlegen des Flows als Systembenutzer oder das Annehmen der Identität eines Benutzers wird nicht unterstützt.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten des Flow zum Warten auf Bedingungen nicht. Aktionen oder Flow-Logik, die für Wartebedingungen wie „Um Genehmigung bitten“, „Auf Bedingung warten“ oder „Eine Dauer warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt das Anhalten eines Flows zur Ausführung über einen MID-Server nicht.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name des auszuführenden Flows. Beispiel: global.flow_name. Suchen Sie das Feld Interner Name in der Liste der Flows Workflow-Studio. |
| Eingaben | Karte | Name-Wert-Paare, die Auslösereingaben definieren. Sie finden die verfügbaren Auslösereingaben und erforderlichen Datentypen im Abschnitt Auslöser des Flows. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| void |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('ed92e8d173d023002728660c4cf6a7bc');
var inputs = {};
inputs['current'] = grIncident;
inputs['table_name'] = 'incident';
sn_fd.FlowAPI.executeFlowQuick('global.test_quick_flow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – executeSubflow(Zeichenfolge „name“, Zuordnung „inputs“, Zahl „timeout“)
Führt einen Subflow synchron aus einem serverseitigen Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name des auszuführenden Subflow, z. B. global.subflow_name. |
| inputs | Zuordnung | Name-Wert-Paare, die Subflow-Eingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| Objekt | Objekt mit den Subflow-Ausgaben. |
| Ausnahme | Die API löst eine Ausnahme aus, wenn ein synchron aufgerufener Flow angehalten wird. Die aktuelle Ausführung befindet sich im Status „Warten“. In den meisten Fällen wird die Ausnahme entfernt, wenn der Flow fortgesetzt wird. Die API kann jedoch einen Flow, der an einen MID Server gesendet wurde, nicht fortsetzen. |
In diesem Beispiel verwendet das Skript „sn_fd.FlowAPI.executeSubflow“, um einen Subflow mit dem Namen „subflowTest“ im globalen Bereich auszuführen. Eine Variable mit dem Namen „input“ enthält die Eingaben für den Subflow. In diesem Fall einen Namen und ein Passwort. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
var inputs = {};
inputs['name'] = ; // String
inputs['password2'] = ; // Password (2 Way Encrypted)
// Execute Synchronously: Run in foreground.
// var timeout = ; //timeout in ms
//sn_fd.FlowAPI.executeSubflow('global.subflowTest', inputs, timeout)
var outputs = sn_fd.FlowAPI.executeSubflow('global.subflowTest', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI - executeSubflowQuick(Zeichenfolgenname, Zuordnungseingaben, Anzahl Zeitüberschreitung)
Führen Sie einen Subflow aus einem serverseitigen Skript synchron zur aktuellen Anwendersitzung aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessern Sie die Leistung, indem Sie den Aufwand für die Datensatzverwaltung eliminieren. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Als Anwender ausführen
- Diese Methode führt den Flow als der Benutzer aus, der die Sitzung initiiert. Das Festlegen des Flows als Systembenutzer oder das Annehmen der Identität eines Benutzers wird nicht unterstützt.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten des Flow zum Warten auf Bedingungen nicht. Aktionen oder Flow-Logik, die für Wartebedingungen wie „Um Genehmigung bitten“, „Auf Bedingung warten“ oder „Eine Dauer warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt das Anhalten eines Flows zur Ausführung über einen MID-Server nicht.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name des auszuführenden Subflows. Beispiel: global.subflow_name. Suchen Sie das Feld Interner Name in der Liste der Subflows Workflow-Studio. |
| Eingaben | Zuordnung | Name-Wert-Paare, die Subflow-Eingaben definieren. Die verfügbaren Subflow-Eingaben und erforderlichen Datentypen finden Sie unter Eingaben im Subflow. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Zeitüberschreitung | Nummer | Optional. Zeitüberschreitung in Millisekunden. Dieser Wert überschreibt die von der Systemeigenschaft com.glide.hub.flow_api.default_execution_time angegebene Standard-Zeitüberschreitung von 30 Sekunden. Nach Ablauf der Zeitüberschreitung wird eine Ausnahme ausgelöst. |
| Typ | Beschreibung |
|---|---|
| Objekt | Objekt mit den vom Subflow definierten Ausgaben. Sie finden die Ausgaben für den Subflow unter Subflow-Eingaben und -Ausgaben in der Subflow-Modellierung. |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('57af7aec73d423002728660c4cf6a71c');
var inputs = {};
inputs['variable'] = grIncident;
var outputs = sn_fd.FlowAPI.executeSubflowQuick('global.test_quick_run_subflow', inputs);
// Get Outputs:
// Note: outputs can only be retrieved when executing synchronously.
var output1 = outputs['output1'];
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – getErrorMessage(String contextId)
Gibt die Fehlermeldungen zurück, die von einem Flow, Subflow oder einer Aktion erzeugt wurden. Diese Methode kann keine Nachrichten von Flows, Subflows oder Aktionen zurückgeben, die mit der Quick ()-API ausgeführt werden.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Die sys_id des Flows, Subflows oder der Aktion, deren Fehlermeldungen Sie abrufen möchten. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Der letzte Vorgang und die Fehlermeldung, die er erzeugt hat. |
Dieses Beispiel startet einen globalen Subflow namens test_error_subflow und gibt alle von ihm erzeugten Fehlermeldungen zurück. Normalerweise führt ein einzelnes Skript nicht einen Flow aus und erhält dann seine Fehlermeldungen. Normalerweise hat entweder ein anderes Skript oder Workflow-Studio den Flow bereits ausgeführt. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
// Gather inputs to call flow
var inputs = {};
inputs['ah_task'] = myTaskRecord; // GlideRecord of table: task
inputs['ah_comment'] ='Test Comment' ; // String
// Call flow with known errors
var contextId = sn_fd.FlowAPI.startSubflow('global.test_error_subflow', inputs);
// Get flow error message
var errormsg = sn_fd.FlowAPI.getErrorMessage(contextId);
return errormsg;
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
Ausgabe:
Operation (test_error_flow.574033f6db6811102166e2291396199f.274073f6db6811102166e22913961908.0be0d916c31332002841b63b12d3ae13) failed with error: com.snc.process_flow.exception.OpException: Value of field record is not a GlideRecord
at com.snc.process_flow.operation.FieldValue.getGlideRecord(FieldValue.java:145)
at com.snc.process_flow.operation.CRUDOperation.getInputValidGlideRecord(CRUDOperation.java:54)
at com.snc.process_flow.operation.RecordDeleteOperation.run(RecordDeleteOperation.java:26)
at com.snc.process_flow.engine.Operation.execute(Operation.java:212)
at com.snc.process_flow.engine.restricted_caller_access.ExecuteWithCallerAccessTracking.executeWithMetaStack(ExecuteWithCallerAccessTracking.java:31)
at com.snc.process_flow.engine.ProcessEngine.executeOps(ProcessEngine.java:570)
at com.snc.process_flow.engine.ProcessEngine.runInternal(ProcessEngine.java:476)
at com.snc.process_flow.engine.ProcessEngine.run(ProcessEngine.java:462)
at com.snc.process_flow.engine.ProcessAutomation.run(ProcessAutomation.java:86)
at com.snc.process_flow.engine.GlideProcessAutomation.runSync(GlideProcessAutomation.java:155)
at com.snc.process_flow.engine.GlideProcessAutomation.runWithDomain(GlideProcessAutomation.java:270)
at com.snc.process_flow.engine.GlideProcessAutomation.lambda$runAsUserSync$1(GlideProcessAutomation.java:237)
at com.snc.process_flow.engine.PFSessionClone.run(PFSessionClone.java:70)
at com.snc.process_flow.engine.GlidePFSession.runPlanAsUserSession(GlidePFSession.java:42)
at com.snc.process_flow.engine.GlideProcessAutomation.runAsUserSync(GlideProcessAutomation.java:235)
at com.snc.process_flow.engine.GlideProcessAutomation.messageFlow(GlideProcessAutomation.java:330)
at com.snc.process_flow.engine.GlideProcessAutomation.messageFlow(GlideProcessAutomation.java:309)
at com.snc.process_flow.engine.ProcessHubEventHandler.doSendMessage(ProcessHubEventHandler.java:475)
at com.snc.process_flow.engine.ProcessHubEventHandler.process(ProcessHubEventHandler.java:119)
at com.snc.process_flow.engine.ProcessHubEventHandler.process(ProcessHubEventHandler.java:91)
at com.snc.process_flow.engine.FlowEventManager.processEvents(FlowEventManager.java:122)
at com.glide.job.EventHandlerJob.execute(EventHandlerJob.java:38)
at com.glide.schedule.JobExecutor.lambda$executeJob$0(JobExecutor.java:129)
at com.snc.db.data_replicate.replicator.DataReplicationAdvisors.runInOriginatorContext(DataReplicationAdvisors.java:73)
at com.glide.schedule.JobExecutor.lambda$inDataReplicationContext$2(JobExecutor.java:159)
at com.glide.schedule.JobExecutor.executeJob(JobExecutor.java:132)
at com.glide.schedule.JobExecutor.execute(JobExecutor.java:116)
at com.glide.schedule_v2.SchedulerWorkerThread.executeJob(SchedulerWorkerThread.java:338)
at com.glide.schedule_v2.SchedulerWorkerThread.lambda$process$0(SchedulerWorkerThread.java:220)
at com.glide.worker.TransactionalWorkerThread.executeInTransaction(TransactionalWorkerThread.java:35)
at com.glide.schedule_v2.SchedulerWorkerThread.process(SchedulerWorkerThread.java:220)
at com.glide.schedule_v2.SchedulerWorkerThread.run(SchedulerWorkerThread.java:101)
FlowAPI – getFlowStages(String scopedFlowName)
Geben Sie eine JSON-Zeichenfolge zurück, die die Liste der Flow-Phasen enthält.
| Name | Typ | Beschreibung |
|---|---|---|
| scopedFlowName | Zeichenfolge | Anwendungsbereich und Name des Flows, dessen Phasen Sie abrufen möchten. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | JSON-formatierte Zeichenfolge, die die Phasen des Flows nach den Phasendatensatzwerten auflistet. |
In diesem Beispiel wird gezeigt, wie die Phasen für den Flow zur Anforderung eines Servicekatalogelements abgerufen werden.
(function() {
try {
// Name of flow with stages
var flowName = "service_catalog_item_request";
// Get flow stages
var flowStages = sn_fd.FlowAPI.getFlowStages(flowName);
//Print JSON as info message
gs.info(flowStages);
return flowStages;
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
Ausgabe:
Die JSON-Zeichenfolge enthält Name/Wert-Paare für ein Stufenfeld. Weitere Informationen finden Sie unter .
[
{
"label": "Manager Approval",
"value": "manager_approval",
"type": "standard",
"duration": "1970-01-03 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 0
},
{
"label": "Set current stage state to: [Error]",
"value": "Set current stage state to: [Error]",
"type": "error",
"duration": "1970-01-01 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": false,
"order": 0
},
{
"label": "Dept. Head Approval",
"value": "Dept. Head Approval",
"type": "standard",
"duration": "1970-01-03 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 1
},
{
"label": "CIO Approval",
"value": "CIO Approval",
"type": "standard",
"duration": "1970-01-03 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 2
},
{
"label": "Order Fulfillment",
"value": "Order Fulfillment",
"type": "standard",
"duration": "1970-01-05 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 3
},
{
"label": "Backordered",
"value": "Backordered",
"type": "standard",
"duration": "1970-01-15 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 4
},
{
"label": "Deployment",
"value": "Deployment",
"type": "standard",
"duration": "1970-01-02 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 5
},
{
"label": "Request Cancelled",
"value": "Request Cancelled",
"type": "standard",
"duration": "1970-01-01 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 6
},
{
"label": "Completed",
"value": "complete",
"type": "standard",
"duration": "1970-01-01 00:00:00",
"states": {
"pending": "Pending - has not started",
"inprogress": "In progress",
"skipped": "Skipped",
"complete": "Completed",
"error": "Error"
},
"flow": "30f3d26187e92300e0ef0cf888cb0b91",
"alwaysShow": true,
"order": 7
}
]
FlowAPI – getOutputs(String contextId)
Gibt die Ausgaben einer abgeschlossenen Aktion oder eines abgeschlossenen Subflows zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Die sys_id der Aktion oder des Subflows, deren Ausgaben Sie abrufen möchten. |
| Typ | Beschreibung |
|---|---|
| Objekt | Objekt, das die Aktions- oder Subflow-Ausgaben enthält. |
Dieses Beispiel startet einen globalen Subflow namens test_subflow, wartet, bis der Flow abgeschlossen ist, und ruft dann seine Ausgabewerte ab. Normalerweise führt ein einzelnes Skript nicht einen Flow aus und ruft dann seine Ausgabewerte ab. Da ein Flow vor dem Aufruf von getOutputs() möglicherweise nicht abgeschlossen wird, wird in diesem Beispiel eine Wartezeit verwendet. Normalerweise hat entweder ein anderes Skript oder Workflow-Studio den Flow bereits ausgeführt. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
// Gather inputs to call flow
var inputs = {};
inputs['ah_task'] = myTaskRecord; // GlideRecord of table: task
inputs['ah_comment'] ='Test Comment' ; // String
// Call flow
var contextId = sn_fd.FlowAPI.startSubflow('global.test_subflow', inputs);
// Wait for the flow to finish running
// Get flow outputs
var outputs = sn_fd.FlowAPI.getOutputs(contextId);
var output1 = outputs['output1'];
return output1;
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – getRunner()
Gibt ein ScriptableFlowRunner -Generator-Objekt für einen Flow oder eine Aktion zurück, die Sie ausführen möchten.
| Name | Typ | Beschreibung |
|---|---|---|
| Keine |
| Typ | Beschreibung |
|---|---|
| ScriptableFlowRunner | Builder-Objekt, das zum Ausführen einer Workflow-Studio -Aktion, eines Flows oder eines Subflows verwendet wird. |
In diesem Beispiel wird ein Flow synchron ausgeführt.
(function() {
try {
var inputs = {};
inputs['sys_id'] = '57af7aec73d423002728660c4cf6a71c'; // Pass the record's sys_id in as input.
var result = sn_fd.FlowAPI.getRunner() // Create a ScriptableFlowRunner builder object.
.action('global.markapproved') // Run the global scope action named markapproved.
.inForeground()
.inDomain('TOP/ACME') // Run the action from the TOP/ACME domain.
.withInputs(inputs)
.run(); // Run the action and return a FlowRunnerResult object.
var contextId = result.getContextId(); // Retrieve the context ID from the result
var dateRun = result.getDate();
var domainUsed = result.getDomainId(); // Retrieve the Domain ID from the result.
var flowName = result.getFlowObjectName();
var flowObjectType = result.getFlowObjectType();
var outputs = result.getOutputs(); // Retrieve any outputs from the action execution.
var newApprovalStatus = outputs['approval']; // Echo back the approval status for verification.
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – getStatus(String contextId)
Gibt den Status eines Flows, Subflows oder einer Aktion zurück.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Die sys_id des Flows, Subflows oder der Aktion, deren Status Sie abrufen möchten. |
| Parameter | Typ | Beschreibung |
|---|---|---|
| <Object> | Objekt | Objekt, das den aktuellen Status des Flows, Subflows oder der Aktion als Name-Wert-Paare enthält. |
| <Object>.hasSuchfehler | Boolean | Kennzeichnung, die angibt, ob beim Suchen des Kontextstatus des Flows, Subflows oder der Aktion ein Problem aufgetreten ist. |
| <Object>.Fehlermeldung | Zeichenfolge | Fehlermeldung, die von der Kontextsuche zurückgegeben wird. Dieser Parameter ist ungültig, wenn hasLookupError auf „false“ festgelegt ist. |
| <Object>.KontextStatus | Objekt | Objekt mit Statusdetails zum abgefragten Flow, Subflow oder zur Aktion. |
| <Object>.KontextStatus.Status | Zeichenfolge | Status des Flows, Subflows oder Aktionskontexts. Einige Statuswerte enthalten zusätzliche Informationen in zugehörigen Parametern.
|
| <Object>.KontextStatus.FehlerStatus | Zeichenfolge | Flow-Abschlussstatus, der durch die Flow-Fehlerbehandlung erzeugt wird. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status COMPLETE befindet.
|
| <Object>.KontextStatus.Nachricht | Zeichenfolge | Fehlermeldung, die vom Flow, Subflow oder der Aktion zurückgegeben wird. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status FEHLER befindet. |
| <Object>.contextStatus.canceledReason | Zeichenfolge | Vom Flow, Subflow oder Aktion zurückgegebene Nachricht zum Abbrechen. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status CANCELLED befindet. |
| <Object>.contextStatus.isRunOnMid | Boolean | Kennzeichnung, die angibt, ob der Flow, Subflow oder die Aktion in einer MID-Server-Umgebung ausgeführt wird. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status IN_PROGRESS befindet. |
| <Object>.contextStatus.waitingOn | Array | Liste der Elemente, auf die der aktuelle Flow, Subflow oder die aktuelle Aktion wartet. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status WARTEN befindet. |
| <Object>.KontextStatus.WartenAuf.Bestellen | Zeichenfolge | Flow-Schrittnummer des Elements, das den Flow zum Warten veranlasst. Wenn die Warteaktion eine anwenderdefinierte Aktion innerhalb eines Flows ist, enthält die Reihenfolge auch einen Zeitraum und die Aktionsschrittnummer der anwenderdefinierten Aktion, auf die der Flow wartet. |
| <Object>.Kontextstatus.WartenAuf.Schritttyp | Zeichenfolge | Typ der Aktion oder des Flow-Schritts, der bzw. die den Flow, den Subflow oder die Aktion zum Warten veranlasst. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status WARTEN befindet. Hier sind einige gängige Beispiele.
|
| <Object>.KontextStatus.WartenAuf.Tabelle | Zeichenfolge | Tabellenname, der den Datensatz enthält, auf den der Flow, Subflow oder die Aktion wartet. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status „WARTEN“ befindet und stepType WAIT_FOR_CONDITION, WAIT_FOR_CONDITION_WITH_TIMEout, ASK_FOR_APPROVAL oder CREATE_TASK_WITH_WAIT lautet. |
| <Object>.KontextStatus.WaitingOn.Bedingung | Zeichenfolge | Abfragebedingung des Datensatzes, auf den der Flow, der Subflow oder die Aktion wartet. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status WARTEN befindet und eine Bedingung vorliegt, die erfüllt sein muss, um die Ausführung fortzusetzen. |
| <Object>.KontextStatus.WartenAm.Endzeit | Ganzzahl | Endzeit, auf die der Flow, Subflow oder die Aktion wartet. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status WARTEN befindet und stepType WAIT_FOR_CONDITION_WITH_TIMEout, TIMER oder SLA_TIMER ist. |
| <Object>.contextStatus.waitingOn.approvalRule | Zeichenfolge | Genehmigungsregel, auf die der Flow, Subflow oder die Aktion wartet. Die API generiert diesen Parameter nur, wenn sich der Flow, Subflow oder die Aktion im Status WARTEN befindet und der Schritttyp ASK_FOR_APPROVAL ist. |
| <Object>.KontextStatus.WartenAuf.KontextId | Zeichenfolge | Die sys_id des Subflows, auf den der Flow oder Subflow wartet. Die API generiert diesen Parameter nur, wenn sich der Flow oder Subflow im Status WAITING befindet und der stepType auf SUBFLOW festgelegt ist. |
In diesem Beispiel wird ein Flow ausgeführt, der Folgendes in paralleler Flow-Logik enthält. Normalerweise führt ein einzelnes Skript nicht einen Flow aus und erhält dann seine Fehlermeldungen. Normalerweise hat entweder ein anderes Skript oder Workflow-Studio den Flow bereits ausgeführt.
(function() {
try {
var result = sn_fd.FlowAPI.getRunner() // Create a ScriptableFlowRunner builder object.
.flow('global.test_do_in_parallel') // Run the global scope flow named do_in_parallel.
.run(); // Run the flow and return a FlowRunnerResult object.
var contextId = result.getContextId(); // Retrieve the context ID from the result
var flowStatus = sn_fd.FlowAPI
.getStatus(contextId); // Retrieve any outputs from the flow execution.
JSON.stringfy(flowStatus); // Convert object to string
return flowStatus;
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
{
"hasLookupError": false,
"errorMessage": "",
"contextStatus": {
"state": "WAITING",
"waitingOn": [
{
"order":"1",
"stepType": "TIMER",
"endTime": 1713627497643
},
{
"order":"5",
"stepType": "WAIT_FOR_CONDITION_WITH_TIMEOUT",
"table": "incident",
"condition": "sys_id=10e8b43243200210338774d6ebb8f22d^short_description=112",
"endTime": 1713645497800
}
]
}
}FlowAPI – hasApprovals(String scopedFlowName)
Überprüft, ob ein Flow in einem bestimmten Bereich Genehmigungsaktionen enthält.
Die Methode hasApprovals() bestimmt, ob ein Flow innerhalb eines bestimmten Umfangs Genehmigungsanfrage-Aktionen enthält. Diese Methode überprüft auch, ob Genehmigungsanfrage-Aktionen innerhalb des Flows unter Flow-Logikblöcken geschachtelt sind. Weitere Informationen hierzu finden Sie unter Aktionen zum Anfordern der Genehmigung.
| Name | Typ | Beschreibung |
|---|---|---|
| scopedFlowName | Zeichenfolge | Umfang und interner Name des auszuführenden Flows. Beispiel: global.flow_name. Suchen Sie das Feld Interner Name in der Liste der Flows Workflow-Studio. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Gibt einen der folgenden Zeichenfolgenwerte zurück:
|
Im folgenden Beispiel wird überprüft, ob der Flow „example_flow“ im globalen Bereich „Genehmigung anfordern“-Aktionen enthält, und das Ergebnis wird protokolliert.
(function() {
try {
var result = sn_fd.FlowAPI.hasApprovals('global.example_flow');
gs.log('Result: ' + result);
}
catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – neustartFlowFromContext(String ContextId, Zuordnung bereitgestellte Eingaben)
Startet einen Flow, Subflow oder eine Aktion neu, die im Hintergrund ausgeführt wurde. Sie können neue Eingaben angeben oder sie auslassen, um die zuvor bereitgestellten Eingaben wiederzuverwenden.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Die sys_id des Flows, Subflows oder der Aktion, die Sie neu starten möchten. Dieser Flow, Subflow oder diese Aktion muss im Hintergrund ausgeführt worden sein und über einen zugeordneten sysevent-Datensatz verfügen. |
| bereitgestelltEingaben | Objekt | Optional. Zuordnungsobjekt mit den Name-Wert-Paaren, die Ersatzeingaben für den Flow, Subflow oder die Aktion definieren. Wenn Sie für diesen Parameter weglassen oder einen Nullwert angeben, wird der Flow, Subflow oder die Aktion mit den zuvor angegebenen Eingaben ausgeführt. |
| Typ | Beschreibung |
|---|---|
| SkriptfähigeFlowRunnerErgebnisseBereichsbezogene | Objekt mit den Ausführungsdetails einer Workflow-Studio -Aktion, eines Flows oder Subflows. |
Startet einen Beispiel-Flow neu, der einen datensatzbasierten Auslöser in der Incident-Tabelle enthält. Der ursprüngliche Flow verwendete den Beispiel-Incident INC0008112 als Eingabe. Wenn der Flow neu gestartet wird, verwendet er stattdessen den Beispiel-Incident INC0008111 als Eingabe.
(function() {
try {
var flowContextID = '4216396ffd7d11107edcf07204c30fd5'; // sys_id of sys_flow_context record
var oldIncidentRecord = '552c48888c033300964f4932b03eb092'; // sys_id of INC0008112
var newIncidentRecord = 'a83820b58f723300e7e16c7827bdeed2'; // sys_id of INC0008111
var inputs = {};
var gr = new GlideRecord('incident'); // Create new incident object
gr.get(newIncidentRecord); // Get GlideRecord object for INC0008111
inputs['current'] = gr; // Set new Incident record as input
inputs['table_name'] = 'incident'; // Set table name to Incident
var result = sn_fd.FlowAPI.getRunner() // Create a ScriptableFlowRunner builder object.
.restartFlowFromContext(flowContextID, inputs); // Restart flow with new inputs.
var contextId = result.getContextId(); // Retrieve the context ID from the result
var dateRun = result.getDate();
gs.info(contextId + ' ' + dateRun);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – scheduleCancel(String contextId, Zeichenfolgengrund, GanzzahldelaySeconds)
Planen Sie ein Systemereignis in der Flow-Engine-Warteschlange, um einen Flow, der sich im Status „In Bearbeitung“, „Vermutlich unterbrochen“ oder „Warten“ befindet, nach einer Verzögerung abzubrechen.
| Name | Typ | Beschreibung |
|---|---|---|
| contextId | Zeichenfolge | Sys_id des Ausführungsdetail-Datensatzes für den Flow, Subflow oder die Aktion. Der Ziel-Flow, Subflow oder die Aktion muss sich im Status „In Bearbeitung“, „Vermutlich unterbrochen“ oder „Warten“ befinden. Greifen Sie auf die Ausführungsdetails zu, indem Sie zur Registerkarte Flow-Ausführungen in Workflow-Studionavigieren, oder übergeben Sie die sys_id des von der Methode zurückgegebenen Kontextdatensatzes. Hinweis: Der Abbruch kann zu einer geringfügigen Verzögerung führen, wenn der Zielkontext auf einem anderen Knoten der Instanz ausgeführt wird. Auf demselben Knoten ausgeführte Kontexte werden sofort abgebrochen. Kontexte, die auf einem anderen Knoten ausgeführt werden, müssen zuerst warten, bis der Abbruch an den entsprechenden Knoten weitergeleitet wird. |
| Grund | Zeichenfolge | Grund für den Abbruch des Flows, Subflows oder der Aktion. Wird im Feld Nachricht der Tabelle „Flow-Engine-Protokolleinträge“ [sys_flow_log] angezeigt. |
| DelaySeconds | Ganzzahl | Optional. Anzahl der zu wartenden Sekunden, bevor ein Abbruchereignis in der Flow-Engine-Warteschlange verarbeitet wird. Wenn Sie diesen Parameter weglassen, verwendet die Methode den Standardwert 1 Sekunde. Sie können diesen Parameter verwenden, um die Auswirkungen auf die Leistung zu vermeiden, wenn Sie den Abbruch von Tausenden von Flow-Kontexten gleichzeitig planen. Anstatt alle Abbrüche gleichzeitig auszuführen, planen Sie einen Stapel von Flow-Abbrüchen mit Verzögerung. Alternativ können Sie die Verzögerung als Zeitüberschreitungswert für einen asynchronen Flow verwenden. |
| Typ | Beschreibung |
|---|---|
| Keine |
In diesem Beispiel wird der Rückgabewert der startFlow()- Methode verwendet, um den Abbruch von Flows mit langer Laufzeit zu planen.
(function() {
var now_GR = new GlideRecord('incident');
now_GR.addQuery('number', 'INC0000050');
now_GR.query();
now_GR.next();
try {
var inputs = {};
inputs['current'] = now_GR; // GlideRecord of table:
inputs['table_name'] = 'incident';
// Starts the flow asynchronously.
var contextId = sn_fd.FlowAPI.startFlow('global.myFlow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
// Call the scheduleCancel() method using the context Id returned from the startFlow() method
sn_fd.FlowAPI.scheduleCancel(contextId, 'Flow took too long to execute.', 60);
In diesem Beispiel wird der Abbruch von Flows mit dem Namen Test-Flow geplant.
var now_GR = new GlideRecord("sys_flow_context");
now_GR.addQuery("name", "Test Flow");
now_GR.query();
while (now_GR.next()) {
sn_fd.FlowAPI.scheduleCancel(now_GR.getUniqueValue(), 'Canceling Test Flows', 60);
}
In diesem Beispiel wird der Parameter „delaySeconds“ verwendet, um Flow-Abbruchaufträge in Batches auszuführen. Verwenden Sie Batches, um Tausende von Flow-Kontexten abzubrechen.
var delaySeconds = 1;
for (var i; i < sys_flow_context.length; ++i) {
if (i % 100 === 0) {
delaySeconds = delaySeconds + 60;
}
var contextId = sys_flow_context[i];
var reason = "Example reason";
sn_fd.FlowAPI.scheduleCancel(contextId, reason, delaySeconds);
}
FlowAPI – sendMessage(String contextSysID, Zeichenfolgennachricht, Zeichenfolgennutzlast)
Senden Sie eine bestimmte Nachrichten- und Payload-Antwort an einen Flow, der angehalten ist und auf eine Nachricht wartet.
| Name | Typ | Beschreibung |
|---|---|---|
| contextSysID | Zeichenfolge | Der sys_id-Wert des angehaltenen Flows oder Subflows, der auf eine bestimmte Nachricht wartet, um fortgesetzt zu werden. Der Flow oder Subflow muss die Aktion Warten auf Nachricht enthalten. Weitere Informationen finden Sie unter Wait For Message action. |
| Nachricht | Zeichenfolge | Die Textzeichenfolge, die an den wartenden Flow oder Subflow gesendet werden soll. Wenn dieser Nachrichtenwert mit dem in der Aktion Auf Nachricht warten aufgeführten Nachrichtenwert übereinstimmt, wird die Ausführung des Flows oder Subflows fortgesetzt. Weitere Informationen finden Sie unter Wait For Message action. |
| Nutzlast | Zeichenfolge | Der Ausgabewert der Textzeichenfolge, der an den wartenden Flow gesendet werden soll. Der Flow oder Subflow kann die Nutzlast als Eingabe verwenden, wenn die Ausführung fortgesetzt wird. Sie können beispielsweise einen Grund angeben, warum ein Datensatz erneut geöffnet wurde oder warum eine neue Genehmigung erforderlich war. |
| Typ | Beschreibung |
|---|---|
| Keine |
In diesem Beispiel wird die Nachricht Flow fortsetzen gesendet, um einen angehaltenen Flow neu zu starten. Der angehaltene Flow kann den Nutzlastwert dann als Daten an anderer Stelle im Flow verwenden.
(function() {
try {
// var change = '154a6320db9b12102166e229139619fc'; // Example sys_id of change record
var pausedFlowId = '6e9bab60949b1210dda11cd237cd955d'; // Example sys_id of a paused flow
var resumeMessage = 'Resume Flow'; // Message that paused flow is waiting for
var payload = 'Resubmitted for approval'; // Data to send back to flow
var result = sn_fd.FlowAPI
.sendMessage(pausedFlowId, resumeMessage, payload); // Send a message to the paused flow
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
Ausgabe:
[0:00:00.074] Script completed in scope global: script
Script execution history and recovery available here
Operation Table Row Count
delete sys_flow_runtime_state_chunk 1
insert sys_flow_runtime_state_chunk 1
update sys_flow_context 1
record-watcher asynchronous tracking complete - time: 3 ms. Executed responders: 1
record-watcher asynchronous tracking complete - time: 3 ms. Executed responders: 1
record-watcher asynchronous tracking complete - time: 3 ms. Executed responders: 1
FlowAPI – setEncryptedOutput(Zeichenfolge „password“)
Erstellt password2-Werte innerhalb eines Skriptschritts.
Ermitteln Sie einen verschlüsselten password2-Wert, der von einem GlideRecord zurückgegeben wird. Dadurch kann das System den Wert als maskiertes Passwort anstelle einer verschlüsselten Zeichenfolge anzeigen.
| Name | Typ | Beschreibung |
|---|---|---|
| Passwort | Zeichenfolge | Verschlüsselter password2-Wert. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Verschlüsselter password2-Wert, der von der Engine als Passwortwert erkannt wird. |
In diesem Beispiel wird der Wert eines password2-Felds aus einem Benutzerdatensatz zurückgegeben und in einer Variablen gespeichert. Diese Variable wird an die Methode „setEncryptedOutput“ übergeben, die mit „sn_fd.GlideActionUtil.setEncryptedOutput“ angerufen wird. Die Instanz erkennt den zurückgegebenen Wert als Passwort.
(function execute(inputs, outputs) {
// ...code...
var now_GR = new GlideRecord('sys_user');
now_GR.addQuery('first_name' , 'Abel');
now_GR.query();
now_GR.next();
var pwVal = now_GR.getValue('pw2');
outputs['usedSetEncrypted'] = sn_fd.GlideActionUtil.setEncryptedOutput(pwVal);
outputs['justSetDirectly'] = pwVal;
})(inputs, outputs);
FlowAPI – startAction(String name, Map inputs)
Führt eine Aktion asynchron über ein serverseitiges Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name der auszuführenden Aktion, z. B. global.action_name. |
| inputs | Karte | Name-Wert-Paare, die Aktionseingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Sys-ID des Kontextdatensatzes für die Aktion Greifen Sie auf den Kontextdatensatz zu, indem Sie zur Registerkarte Flow-Ausführungen in Workflow-Studionavigieren, eine Flow-Ausführung auswählen und auf Kontextdatensatz öffnenklicken. |
Dieses Beispiel verwendet „sn_fd.FlowAPI.startAction“, um eine Aktion mit dem Namen „add_comment“ in dem Bereich „sn_itsm_spoke“ auszuführen. Das inputs-Objekt enthält einen Zieldatensatz und einen Kommentar, der diesem Datensatz hinzugefügt werden soll. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
var inputs = {};
inputs['ah_task'] = myTaskRecord; // GlideRecord of table: task
inputs['ah_comment'] ='Test Comment' ; // String
var contextId = sn_fd.FlowAPI.startAction('sn_itsm_spoke.add_comment', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – startActionQuick(Zeichenfolgenname, Zuordnungseingaben)
Führt eine Aktion asynchron aus einem serverseitigen Skript aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessern Sie die Leistung, indem Sie den Aufwand für die Datensatzverwaltung eliminieren. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten der Aktion zum Warten auf Bedingungen nicht. Schritte, die für Wartebedingungen wie „Um Genehmigung bitten“ oder „Auf Bedingung warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt nicht das Anhalten einer Aktion, die über einen MID-Server ausgeführt wird.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name der auszuführenden Aktion. Beispiel: global.action_name. Suchen Sie das Feld Interner Name in der Liste der Workflow-Studio -Aktionen. |
| Eingaben | Karte | Name-Wert-Paare, die Aktionseingaben definieren. Die verfügbaren Aktionseingaben und erforderlichen Datentypen finden Sie unter Eingaben in der Aktionsgliederung. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Typ | Beschreibung |
|---|---|
| void |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('57af7aec73d423002728660c4cf6a71c');
var inputs = {};
inputs['variable'] = grIncident;
sn_fd.FlowAPI.startActionQuick('global.update_record_test', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – startFlow(String name, Map inputs)
Führt einen Flow über ein serverseitiges Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name des auszuführenden Flow, z. B. global.flow_name. |
| inputs | Karte | Name-Wert-Paare, die Auslösereingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Sys-ID des Kontextdatensatzes für den Flow. Greifen Sie auf den Kontextdatensatz zu, indem Sie zur Registerkarte Flow-Ausführungen in Workflow-Studionavigieren, eine Flow-Ausführung auswählen und auf Kontextdatensatz öffnenklicken. |
Dieses Beispiel verwendet „sn_fd.FlowAPI.startFlow“, um einen globalen Flow mit dem Namen „test_flow“ auszuführen. Der Code erstellt eine Variable „inputs“, die Eingaben enthält, die für den Flow erforderlich sind. In diesem Fall den aktuellen Datensatz und die Tabelle für den Datensatz. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
var now_GR = new GlideRecord('incident');
now_GR.addQuery('number', 'INC0009009');
now_GR.query();
now_GR.next();
try {
var inputs = {};
inputs['current'] = now_GR; // GlideRecord of table: Incident
inputs['table_name'] = 'incident';
var contextId = sn_fd.FlowAPI.startFlow('global.test_flow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI - startFlowQuick(Zeichenfolgenname, Zuordnungseingaben)
Führt einen Flow asynchron aus einem serverseitigen Skript aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessern Sie die Leistung, indem Sie den Aufwand für die Datensatzverwaltung eliminieren. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Als Systemanwender ausführen
- Diese Methode führt den Flow als Systemanwender aus. Das Festlegen des Flows als Anwender, der die Sitzung initiiert, oder das Annehmen der Identität eines Anwenders wird nicht unterstützt.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten des Flow zum Warten auf Bedingungen nicht. Aktionen oder Flow-Logik, die für Wartebedingungen wie „Um Genehmigung bitten“, „Auf Bedingung warten“ oder „Eine Dauer warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt das Anhalten eines Flows zur Ausführung über einen MID-Server nicht.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name des auszuführenden Flows. Beispiel: global.flow_name. Suchen Sie das Feld Interner Name in der Liste der Flows Workflow-Studio. |
| Eingaben | Karte | Name-Wert-Paare, die Auslösereingaben definieren. Sie finden die verfügbaren Auslösereingaben und erforderlichen Datentypen im Abschnitt Auslöser des Flows. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Typ | Beschreibung |
|---|---|
| void |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('ed92e8d173d023002728660c4cf6a7bc');
var inputs = {};
inputs['current'] = grIncident;
inputs['table_name'] = 'incident';
sn_fd.FlowAPI.startFlowQuick('global.test_quick_flow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – startSubflow(String name, Map input)
Führt einen Subflow über ein serverseitiges Skript aus.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Der Bereich und der Name des auszuführenden Subflow, z. B. global.subflow_name. |
| inputs | Zuordnung | Name-Wert-Paare, die Subflow-Eingaben definieren. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. |
| Typ | Beschreibung |
|---|---|
| Zeichenfolge | Sys-ID des Kontextdatensatzes für den Subflow. Greifen Sie auf den Kontextdatensatz zu, indem Sie zur Registerkarte Flow-Ausführungen in Workflow-Studionavigieren, eine Flow-Ausführung auswählen und auf Kontextdatensatz öffnenklicken. |
In diesem Beispiel wird mit sn_fd.FlowAPI.startSubflow ein globaler Flow namens test_subflow ausgeführt. Der Code ist in einer try/catch-Anweisung eingeschlossen, um alle Fehler zu erfassen, die bei der Ausführung des Flow auftreten können.
(function() {
try {
var inputs = {};
inputs['ah_task'] = myTaskRecord; // GlideRecord of table: task
inputs['ah_comment'] ='Test Comment' ; // String
var contextId = sn_fd.FlowAPI.startSubflow('global.test_subflow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();
FlowAPI – startSubflowQuick(Zeichenfolgenname, Zuordnungseingaben)
Führt einen Subflow asynchron aus einem serverseitigen Skript aus, ohne Ausführungsdetails oder andere zugehörige Datensätze zu erstellen. Verbessern Sie die Leistung, indem Sie den Aufwand für die Datensatzverwaltung eliminieren. Verwenden Sie diese API, um die Geschwindigkeit der Verarbeitung großer Mengen (z. B. mehrerer Ausführungen pro Sekunde) in einer Produktionsumgebung zu erhöhen.
- Berichterstellung und Datensätze generiert
- Diese Methode erstellt unabhängig von den Workflow-Studio -Einstellungen keine Ausführungsdetails und Kontextdatensätze.
- Als Systemanwender ausführen
- Diese Methode führt den Flow als Systemanwender aus. Das Festlegen des Flows als Anwender, der die Sitzung initiiert, oder das Annehmen der Identität eines Anwenders wird nicht unterstützt.
- Warten Sie auf Support
- Diese Methode unterstützt das Anhalten des Flow zum Warten auf Bedingungen nicht. Aktionen oder Flow-Logik, die für Wartebedingungen wie „Um Genehmigung bitten“, „Auf Bedingung warten“ oder „Eine Dauer warten“ anhalten, werden nicht unterstützt.
- MID-Server-Unterstützung
- Diese Methode unterstützt das Anhalten eines Flows zur Ausführung über einen MID-Server nicht.
| Name | Typ | Beschreibung |
|---|---|---|
| Name | Zeichenfolge | Umfang und interner Name des auszuführenden Subflows. Beispiel: global.subflow_name. Suchen Sie das Feld Interner Name in der Liste der Subflows Workflow-Studio. |
| Eingaben | Zuordnung | Name-Wert-Paare, die Subflow-Eingaben definieren. Die verfügbaren Subflow-Eingaben und erforderlichen Datentypen finden Sie unter Eingaben im Subflow. Verwenden Sie den Eingabenamen, nicht die Eingabebezeichnung. Beispiel: {'table':'incident','sys_id':'a39d8e3cf0212300964feeefe80ff0ed'}. |
| Typ | Beschreibung |
|---|---|
| void |
(function() {
try {
var grIncident = new GlideRecord('incident');
grIncident.get('57af7aec73d423002728660c4cf6a71c');
var inputs = {};
inputs['variable'] = grIncident;
sn_fd.FlowAPI.startSubflowQuick('global.test_quick_run_subflow', inputs);
} catch (ex) {
var message = ex.getMessage();
gs.error(message);
}
})();