Während Sie Ihre Workflows anpassen und erweitern, können Sie auf Workflow-Objekte zugreifen:
Die Workflow-Java-API besteht aus dem Paket com.adobe.granite.workflow
und mehreren Unterpaketen. Der wichtigste Bestandteil der API ist die com.adobe.granite.workflow.WorkflowSession
-Klasse. Die WorkflowSession
-Klasse ermöglicht Zugriff auf Workflow-Objekte während des Designs und während der Laufzeit:
Die Klasse bietet außerdem mehrere Methoden zum Eingreifen in Workflow-Lebenszyklen.
Die folgende Tabelle enthält Links zur Referenzdokumentation verschiedener wichtiger Java-Objekte, die bei der programmgesteuerten Interaktion mit Workflows verwendet werden. Die folgenden Beispiele veranschaulichen, wie Sie die Klassenobjekte im Code abrufen und verwenden.
Funktionen | Objekte |
---|---|
Zugriff auf einen Workflow | WorkflowSession |
Ausführung und Abfrage einer Workflow-Instanz | Workflow WorkItem WorkflowData |
Verwaltung eines Workflow-Modells | WorkflowModel WorkflowNode WorkflowTransition |
Informationen für einen Knoten, der sich im Workflow befindet (oder nicht) | WorkflowStatus |
Wie unter Auffinden des Skripts beschrieben, stellt AEM (über Apache Sling) eine ECMA-Skript-Engine zur Verfügung, die serverseitige ECMA-Skripte ausführt. Die org.apache.sling.scripting.core.ScriptHelper
-Klasse ist für Ihre Skripte sofort als sling
-Variable verfügbar.
Die ScriptHelper
-Klasse bietet Zugriff auf SlingHttpServletRequest
, das Sie später verwenden können, um das Objekt WorkflowSession
abzurufen. Beispiel:
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Die Workflow-Konsole nutzt die REST-API umfassend. Daher wird auf dieser Seite die REST-API für Workflows beschrieben.
Mit dem Befehlszeilen-Tool curl können Sie die Workflow-REST-API verwenden, um auf Workflow-Objekte zuzugreifen und Instanzlebenszyklen zu verwalten. Die Beispiele auf dieser Seite zeigen die Verwendung der REST-API über das Kommandozeilen-Tool „curl“.
Die folgenden Aktionen werden von der REST-API unterstützt:
Mit Firebug, einer Firefox-Erweiterung für die Webentwicklung, können Sie den HTTP-Traffic verfolgen, während die Konsole in Betrieb ist. Sie können beispielsweise mit einer POST
-Anfrage die Parameter und Werte prüfen, die an den AEM-Server gesendet werden.
Auf dieser Seite wird davon ausgegangen, dass AEM auf localhost am Port ausgeführt wird 4502
und dass der Installationskontext " /
" (root). Wenn dies nicht auf Ihre Installation zutrifft, müssen die URIs für die HTTP-Anfragen entsprechend angepasst werden.
Als Rendering-Methode wird für GET
-Anfragen JSON-Rendering unterstützt. Die URLs für GET
sollte .json
-Erweiterung, z. B.:
http://localhost:4502/etc/workflow.json
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/etc/workflow/instances
HTTP-Anfragemethode | Aktionen |
GET |
Listet die verfügbaren Workflow-Instanzen auf. |
POST |
Erstellt eine neue Workflow-Instanz. Die Parameter sind: |
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/etc/workflow/instances.{state}
HTTP-Anfragemethode | Aktionen |
---|---|
GET |
Listet die verfügbaren Workflow-Instanzen und deren Status auf ( RUNNING , SUSPENDED , ABORTED oder COMPLETED ) |
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/etc/workflow/instances/{id}
HTTP-Anfragemethode | Aktionen |
GET |
Ruft die Instanzdaten (Definition und Metadaten) ab, einschließlich der Verknüpfung zum entsprechenden Workflow-Modell. |
POST |
Ändert den Status der Instanz. Der neue Status wird als Parameter gesendet state und muss einen der folgenden Werte aufweisen: RUNNING , SUSPENDED oder ABORTED .Wenn der neue Status nicht erreicht werden kann (z. B. beim Aussetzen einer beendeten Instanz), wird ein 409 (CONFLICT ) wird an den Client zurückgesendet. |
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/etc/workflow/models
HTTP-Anfragemethode | Aktionen |
GET |
Listet die verfügbaren Workflow-Modelle auf. |
POST |
Erstellt ein neues Workflow-Modell. Wenn der Parameter title gesendet wird, wird ein neues Modell mit dem angegebenen Titel erstellt. JSON-Modelldefinition als Parameter anhängen model erstellt ein neues Workflow-Modell gemäß der angegebenen Definition.A 201 Antwort (CREATED ) wird mit einem Location-Header zurückgesendet, der die URL der neuen Workflow-Modell-Ressource enthält.Dasselbe passiert, wenn eine Modelldefinition als Dateiparameter mit dem Namen modelfile .In beiden Fällen ist die model und modelfile Parameter, ein zusätzlicher Parameter namens type ist erforderlich, um das Serialisierungsformat zu definieren. Neue Serialisierungsformate können mithilfe der OSGi-API integriert werden. Ein Standard-JSON-Serializer wird mit der Workflow-Engine bereitgestellt. Er weist den Typ JSON auf. Unten sehen Sie ein Beispiel für das Format. |
Beispiel: im Browser eine Anfrage an http://localhost:4502/etc/workflow/models.json
generiert eine JSON-Antwort ähnlich der folgenden:
[
{"uri":"/var/workflow/models/activationmodel"}
,{"uri":"/var/workflow/models/dam/adddamsize"}
,{"uri":"/var/workflow/models/cloudconfigs/dtm-reactor/library-download"}
,{"uri":"/var/workflow/models/ac-newsletter-workflow-simple"}
,{"uri":"/var/workflow/models/dam/dam-create-language-copy"}
,{"uri":"/var/workflow/models/dam/dam-create-and-translate-language-copy"}
,{"uri":"/var/workflow/models/dam-indesign-proxy"}
,{"uri":"/var/workflow/models/dam-xmp-writeback"}
,{"uri":"/var/workflow/models/dam-parse-word-documents"}
,{"uri":"/var/workflow/models/dam/process_subasset"}
,{"uri":"/var/workflow/models/dam/dam_set_last_modified"}
,{"uri":"/var/workflow/models/dam/dam-autotag-assets"}
,{"uri":"/var/workflow/models/dam/update_asset"}
,{"uri":"/var/workflow/models/dam/update_asset_offloading"}
,{"uri":"/var/workflow/models/dam/dam-update-language-copy"}
,{"uri":"/var/workflow/models/dam/update_from_lightbox"}
,{"uri":"/var/workflow/models/cloudservices/DTM_bundle_download"}
,{"uri":"/var/workflow/models/dam/dam_download_asset"}
,{"uri":"/var/workflow/models/dam/dynamic-media-encode-video"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-thumbnail-replacement"}
,{"uri":"/var/workflow/models/dam/dynamic-media-video-user-uploaded-thumbnail"}
,{"uri":"/var/workflow/models/newsletter_bounce_check"}
,{"uri":"/var/workflow/models/projects/photo_shoot_submission"}
,{"uri":"/var/workflow/models/projects/product_photo_shoot"}
,{"uri":"/var/workflow/models/projects/approval_workflow"}
,{"uri":"/var/workflow/models/prototype-01"}
,{"uri":"/var/workflow/models/publish_example"}
,{"uri":"/var/workflow/models/publish_to_campaign"}
,{"uri":"/var/workflow/models/screens/publish_to_author_bin"}
,{"uri":"/var/workflow/models/s7dam/request_to_publish_to_youtube"}
,{"uri":"/var/workflow/models/projects/request_copy"}
,{"uri":"/var/workflow/models/projects/request_email"}
,{"uri":"/var/workflow/models/projects/request_landing_page"}
,{"uri":"/var/workflow/models/projects/request_launch"}
,{"uri":"/var/workflow/models/request_for_activation"}
,{"uri":"/var/workflow/models/request_for_deactivation"}
,{"uri":"/var/workflow/models/request_for_deletion"}
,{"uri":"/var/workflow/models/request_for_deletion_without_deactivation"}
,{"uri":"/var/workflow/models/request_to_complete_move_operation"}
,{"uri":"/var/workflow/models/reverse_replication"}
,{"uri":"/var/workflow/models/salesforce-com-export"}
,{"uri":"/var/workflow/models/scene7"}
,{"uri":"/var/workflow/models/scheduled_activation"}
,{"uri":"/var/workflow/models/scheduled_deactivation"}
,{"uri":"/var/workflow/models/screens/screens-update-asset"}
,{"uri":"/var/workflow/models/translation"}
,{"uri":"/var/workflow/models/s7dam/request_to_remove_from_youtube"}
,{"uri":"/var/workflow/models/wcm-translation/create_language_copy"}
,{"uri":"/var/workflow/models/wcm-translation/prepare_translation_project"}
,{"uri":"/var/workflow/models/wcm-translation/translate-i18n-dictionary"}
,{"uri":"/var/workflow/models/wcm-translation/sync_translation_job"}
,{"uri":"/var/workflow/models/wcm-translation/translate-language-copy"}
,{"uri":"/var/workflow/models/wcm-translation/update_language_copy"}
]
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502*{uri}*
Wo *{uri}*
ist der Pfad zum Modellknoten im Repository.
HTTP-Anfragemethode | Aktionen |
GET |
Ruft die HEAD Version des Modells (Definition und Metadaten). |
PUT |
Aktualisiert die HEAD -Version des Modells (erstellt eine neue Version).Die vollständige Modelldefinition für die neue Version des Modells muss als Parameter namens model . Zusätzlich wird type -Parameter ist erforderlich, da beim Erstellen neuer Modelle der Wert JSON . |
POST |
Das gleiche Verhalten wie bei PUT. Erforderlich, da AEM Widgets nicht unterstützen PUT Vorgänge. |
DELETE |
Löscht das Modell. Um Firewall-/Proxy-Probleme zu lösen, muss ein POST , die X-HTTP-Method-Override Header-Eintrag mit Wert DELETE wird auch als DELETE -Anfrage. |
Beispiel: im Browser eine Anfrage an http://localhost:4502/var/workflow/models/publish_example.json
gibt eine json
Antwort, die dem folgenden Code ähnelt:
{
"id":"/var/workflow/models/publish_example",
"title":"Publish Example",
"version":"1.0",
"description":"This example shows a simple review and publish process.",
"metaData":
{
"multiResourceSupport":"true",
"tags":"wcm,publish"
},
"nodes":
[{
"id":"node0",
"type":"START",
"title":"Start",
"description":"The start node of the workflow.",
"metaData":
{
}
},
{
"id":"node1",
"type":"PARTICIPANT",
"title":"Validate Content",
"description":"Validate the modified content.",
"metaData":
{
"PARTICIPANT":"admin"
}
},
{
"id":"node2",
"type":"PROCESS",
"title":"Publish Content",
"description":"Publish the modified content.",
"metaData":
{
"PROCESS_AUTO_ADVANCE":"true",
"PROCESS":"com.day.cq.wcm.workflow.process.ActivatePageProcess"
}
},
{
"id":"node3",
"type":"END",
"title":"End",
"description":"The end node of the workflow.",
"metaData":
{
}
}],
"transitions":
[{
"from":"node0",
"to":"node1",
"metaData":
{
}
},
{
"from":"node1",
"to":"node2",
"metaData":
{
}
},
{
"from":"node2",
"to":"node3",
"metaData":
{
}
}
]}
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/etc/workflow/models/{id}.{version}
HTTP-Anfragemethode | Aktionen |
---|---|
GET |
Ruft die Daten des Modells in der angegebenen Version ab (sofern vorhanden). |
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/bin/workflow/inbox
HTTP-Anfragemethode | Aktionen |
GET |
Führt die Arbeitselemente im Posteingang des Benutzers auf, der durch die HTTP-Authentifizierungskopfzeilen identifiziert wird. |
POST |
Schließt das Arbeitselement ab, dessen URI als Parameter gesendet wird item und leitet die entsprechende Workflow-Instanz an den nächsten Knoten weiter, der durch den Parameter definiert wird route oder backroute bei Rücktritt.Wenn der Parameter delegatee gesendet wird, wird das durch den Parameter identifizierte Arbeitselement gesendet. item wird an den angegebenen Teilnehmer delegiert. |
Die folgenden HTTP-Anfragemethoden gelten für:
http://localhost:4502/bin/workflow/inbox/{id}
HTTP-Anfragemethode | Aktionen |
---|---|
GET |
Ruft die Daten (Definition und Metadaten) des Posteingangs ab WorkItem identifiziert durch seine Kennung. |
Um eine Liste aller laufenden Workflows zu erhalten, führen Sie eine GET-Anfrage an folgende Adresse durch:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Beispiel mit curl:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
Die uri
in den Ergebnissen angezeigt werden, können als Instanz verwendet werden id
in anderen Befehlen; Beispiel:
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Diese curl
kann mit jedem Workflow-Status anstelle von RUNNING
.
Um den Workflow-Titel zu ändern, der auf der Registerkarte Instanzen der Workflow-Konsole angezeigt wird, senden Sie einen POST
-Befehl:
in: http://localhost:4502/etc/workflow/instances/{id}
mit den folgenden Parametern:
action
: Der Wert muss: UPDATE
workflowTitle
: Workflow-TitelBeispiel mit curl:
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/{id}
# for example
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
Um eine Liste aller verfügbaren Workflow-Modelle zu erhalten, führen Sie eine GET-Anfrage an folgende Adresse durch:
http://localhost:4502/etc/workflow/models.json
Beispiel mit curl:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Siehe auch Verwalten von Workflow-Modellen.
Die com.adobe.granite.workflow.WorkflowSession
-Klasse von einer javax.jcr.Session
-Objekt oder org.apache.sling.api.resource.ResourceResolver
-Objekt.
Verwenden Sie in einem JSP-Skript (oder Java-Code für eine Servlet-Klasse) das HTTP-Anfrageobjekt, um ein SlingHttpServletRequest
-Objekt abzurufen. Dieses Objekt gewährt Ihnen Zugriff auf ein ResourceResolver
-Objekt. Anpassen der ResourceResolver
Objekt zu WorkflowSession
.
<%
%><%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false"
import="com.adobe.granite.workflow.WorkflowSession,
org.apache.sling.api.SlingHttpServletRequest"%><%
SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
%>
Verwenden Sie die sling
zum Abrufen der SlingHttpServletRequest
-Objekt, mit dem Sie eine ResourceResolver
-Objekt. Anpassen der ResourceResolver
-Objekt WorkflowSession
-Objekt.
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Die folgenden Beispiele zeigen, wie Sie auf Workflow-Modelle zugreifen können:
WorkflowSession.createNewModel
.Verwendete Beispiele:
/var/workflow/models/mymodel/jcr:content/model
).Durch das Löschen des Modells wird die deleted
-Eigenschaft des Modells metaData
untergeordneter Knoten zu true
.
Durch das Löschen wird der Modellknoten nicht entfernt.
Wenn ein neues Modell erstellt wird:
Der Workflow-Modell-Editor erfordert, dass Modelle eine bestimmte Knotenstruktur unten verwenden /var/workflow/models
. Der übergeordnete Knoten des Modells muss vom Typ cq:Page
mit jcr:content
Knoten mit den folgenden Eigenschaftswerten:
sling:resourceType
: cq/workflow/components/pages/model
cq:template
: /libs/cq/workflow/templates/model
Wenn Sie ein Modell erstellen, müssen Sie zunächst diesen cq:Page
-Knoten erstellen und seinen jcr:content
-Knoten als übergeordneten Knoten des Modellknotens verwenden.
Die id
-Argument, das einige Methoden zum Identifizieren des Modells benötigen, ist der absolute Pfad des Modellknotens im Repository:
/var/workflow/models/<*model_name>*/jcr:content/model
<%@include file="/libs/foundation/global.jsp"%><%
%><%@page session="false" import="com.adobe.granite.workflow.WorkflowSession,
com.adobe.granite.workflow.model.WorkflowModel,
org.apache.sling.api.SlingHttpServletRequest"%><%
SlingHttpServletRequest slingReq = (SlingHttpServletRequest)request;
WorkflowSession wfSession = slingReq.getResourceResolver().adaptTo(WorkflowSession.class);
/* Create the parent page */
String modelRepo = new String("/var/workflow/models");
String modelTemplate = new String ("/libs/cq/workflow/templates/model");
String modelName = new String("mymodel");
Page modelParent = pageManager.create(modelRepo, modelName, modelTemplate, "My workflow model");
/* create the model */
String modelId = new String(modelParent.getPath()+"/jcr:content/model")
WorkflowModel model = wfSession.createNewModel("Made using Java",modelId);
/* delete the model */
wfSession.deleteModel(modelId);
%>
var resolver = sling.getRequest().getResource().getResourceResolver();
var wfSession = resolver.adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
var pageManager = resolver.adaptTo(Packages.com.day.cq.wcm.api.PageManager);
//create the parent page node
var workflowPage = pageManager.create("/var/workflow/models", "mymodel", "/libs/cq/workflow/templates/model", "Created via ECMA Script");
var modelId = workflowPage.getPath()+ "/jcr:content/model";
//create the model
var model = wfSession.createNewModel("My Model", modelId);
//delete the model
var model = wfSession.deleteModel(modelId);
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Aufgrund der erforderlichen Detailmenge gilt curl nicht als praktikabel für das Erstellen und/oder Lesen eines Modells.
Sie können die WorkflowStatus-API , um Informationen zum Workflow-Status eines Knotens abzurufen.
Verschiedene Methoden haben den Parameter:
excludeSystemWorkflows
Sie können diesen Parameter auf true
setzen, damit System-Workflows aus den Suchergebnissen ausgeschlossen werden.
You kann die OSGi-Konfiguration aktualisieren Adobe Granite Workflow PayloadMapCache , der den Workflow angibt Models
als System-Workflows betrachtet werden. Es gibt standardmäßig folgende (Laufzeit-) Workflow-Modelle:
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
Wenn Sie einen Teilnehmer-Schritt fortführen müssen, der innerhalb eines festgelegten Zeitraums nicht abgeschlossen wurde, stehen Ihnen folgende Möglichkeiten zur Verfügung:
Implementieren Sie einen OSGI-Ereignis-Listener für die Erstellung und Bearbeitung von Aufgaben.
Geben Sie ein Zeitlimit an (Deadline) und erstellen Sie anschließend einen geplanten Sling-Auftrag, der zu diesem Zeitpunkt ausgelöst wird.
Erstellen Sie einen Auftrags-Handler, der benachrichtigt wird, wenn das Zeitlimit abgelaufen ist, und den Auftrag auslöst.
Dieser Handler führt die erforderlichen Handlungen zum Auftrag durch, wenn dieser noch nicht abgeschlossen ist.
Die durchzuführende Handlung muss eindeutig definiert sein, damit diese Vorgehensweise möglich ist.
Hier sind einige grundlegende Beispiele, wie Sie (programmgesteuert) mit Workflow-Instanzen interagieren.
// starting a workflow
WorkflowModel model = wfSession.getModel(workflowId);
WorkflowData wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);
// querying and managing a workflow
Workflow[] workflows workflows = wfSession.getAllWorkflows();
Workflow workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);
// starting a workflow
var model = wfSession.getModel(workflowId);
var wfData = wfSession.newWorkflowData("JCR_PATH", repoPath);
wfSession.startWorkflow(model, wfData);
// querying and managing a workflow
var workflows = wfSession.getWorkflows("RUNNING");
var workflow= wfSession.getWorkflow(id);
wfSession.suspendWorkflow(workflow);
wfSession.resumeWorkflow(workflow);
wfSession.terminateWorkflow(workflow);
Starten eines Workflows
# starting a workflow
curl -d "model={id}&payloadType={type}&payload={payload}" http://localhost:4502/etc/workflow/instances
# for example:
curl -u admin:admin -d "model=/var/workflow/models/request_for_activation&payloadType=JCR_PATH&payload=/content/we-retail/us/en/products" http://localhost:4502/etc/workflow/instances
Auflisten der Instanzen
# listing the instances
curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Hierdurch werden alle Instanzen aufgelistet. Beispiel:
[
{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
]
Siehe Abrufen einer Liste aller laufenden Workflows mit ihren IDs zum Auflisten von Instanzen mit einem bestimmten Status.
Pausieren eines Workflows
# suspending a workflow
curl -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=SUSPENDED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
Fortsetzen eines Workflows
# resuming a workflow
curl -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=RUNNING" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
Beenden einer Workflow-Instanz
# terminating a workflow
curl -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/{id}
# for example:
curl -u admin:admin -d "state=ABORTED" http://localhost:4502/etc/workflow/instances/server0/2017-03-08/request_for_activation_1
Hier sind einige grundlegende Beispiele, wie Sie (programmgesteuert) mit Arbeitselementen interagieren.
// querying work items
WorkItem[] workItems = wfSession.getActiveWorkItems();
WorkItem workItem = wfSession.getWorkItem(id);
// getting routes
List<Route> routes = wfSession.getRoutes(workItem);
// delegating
Iterator<Participant> delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));
// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));
// querying work items
var workItems = wfSession.getActiveWorkItems();
var workItem = wfSession.getWorkItem(id);
// getting routes
var routes = wfSession.getRoutes(workItem);
// delegating
var delegatees = wfSession.getDelegatees(workItem);
wfSession.delegateWorkItem(workItem, delegatees.get(0));
// completing or advancing to the next step
wfSession.complete(workItem, routes.get(0));
Auflisten von Arbeitselementen aus dem Posteingang
# listing the work items
curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Details zu Arbeitselementen, die sich derzeit im Posteingang befinden, werden aufgelistet. Beispiel:
[{
"uri_xss": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"uri": "/var/workflow/instances/server0/2018-02-26/prototype-01_2/workItems/node2_var_workflow_instances_server0_2018-02-26_prototype-01_2",
"currentAssignee_xss": "workflow-administrators",
"currentAssignee": "workflow-administrators",
"startTime": 1519656289274,
"payloadType_xss": "JCR_PATH",
"payloadType": "JCR_PATH",
"payload_xss": "/content/we-retail/es/es",
"payload": "/content/we-retail/es/es",
"comment_xss": "Process resource is null",
"comment": "Process resource is null",
"type_xss": "WorkItem",
"type": "WorkItem"
},{
"uri_xss": "configuration/configure_analyticstargeting",
"uri": "configuration/configure_analyticstargeting",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/securitychecklist",
"uri": "configuration/securitychecklist",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/enable_collectionofanonymoususagedata",
"uri": "configuration/enable_collectionofanonymoususagedata",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
},{
"uri_xss": "configuration/configuressl",
"uri": "configuration/configuressl",
"currentAssignee_xss": "administrators",
"currentAssignee": "administrators",
"type_xss": "Task",
"type": "Task"
}
Delegieren von Arbeitselementen
# delegating
curl -d "item={item}&delegatee={delegatee}" http://localhost:4502/bin/workflow/inbox
# for example:
curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_act_1&delegatee=administrators" http://localhost:4502/bin/workflow/inbox
Die delegatee
muss eine gültige Option für den Workflow-Schritt sein.
Abschließen oder Fortführen von Arbeitselementen zum nächsten Schritt
# retrieve the list of routes; the results will be similar to {"results":1,"routes":[{"rid":"233123169","label":"End","label_xss":"End"}]}
http://localhost:4502/etc/workflow/instances/<path-to-the-workitem>.routes.json
# completing or advancing to the next step; use the appropriate route ID (rid value) from the above list
curl -d "item={item}&route={route}" http://localhost:4502/bin/workflow/inbox
# for example:
curl -u admin:admin -d "item=/etc/workflow/instances/server0/2017-03-08/request_for_activation_1/workItems/node1_etc_workflow_instances_server0_2017-03-08_request_for_activation_1&route=233123169" http://localhost:4502/bin/workflow/inbox
Verwenden Sie das OSGi-Ereignis-Framework, um auf Ereignisse zu warten, die die Klasse com.adobe.granite.workflow.event.WorkflowEvent
definiert. Diese Klasse bietet auch einige nützliche Methoden zum Abrufen von Informationen über das Thema des Ereignisses. Beispielsweise gibt die Methode getWorkItem
das WorkItem
-Objekt für das Arbeitselement, das am Ereignis beteiligt ist, zurück.
Der folgende Beispielcode definiert einen Dienst, der auf Workflow-Ereignisse wartet und je nach Art des Ereignisses Aufgaben ausführt.
package com.adobe.example.workflow.listeners;
import org.apache.sling.event.jobs.JobProcessor;
import org.apache.sling.event.jobs.JobUtil;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import com.adobe.granite.workflow.event.WorkflowEvent;
import com.adobe.granite.workflow.exec.WorkItem;
/**
* The <code>WorkflowEventCatcher</code> class listens to workflow events.
*/
@Component(metatype=false, immediate=true)
@Service(value=org.osgi.service.event.EventHandler.class)
public class WorkflowEventCatcher implements EventHandler, JobProcessor {
@Property(value=com.adobe.granite.workflow.event.WorkflowEvent.EVENT_TOPIC)
static final String EVENT_TOPICS = "event.topics";
private static final Logger logger = LoggerFactory.getLogger(WorkflowEventCatcher.class);
public void handleEvent(Event event) {
JobUtil.processJob(event, this);
}
public boolean process(Event event) {
logger.info("Received event of topic: " + event.getTopic());
String topic = event.getTopic();
try {
if (topic.equals(WorkflowEvent.EVENT_TOPIC)) {
WorkflowEvent wfevent = (WorkflowEvent)event;
String eventType = wfevent.getEventType();
String instanceId = wfevent.getWorkflowInstanceId();
if (instanceId != null) {
//workflow instance events
if (eventType.equals(WorkflowEvent.WORKFLOW_STARTED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_RESUMED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_SUSPENDED_EVENT)) {
// your code comes here...
} else if (
eventType.equals(WorkflowEvent.WORKFLOW_ABORTED_EVENT) ||
eventType.equals(WorkflowEvent.WORKFLOW_COMPLETED_EVENT)) {
// your code comes here...
}
// workflow node event
if (eventType.equals(WorkflowEvent.NODE_TRANSITION_EVENT)) {
WorkItem currentItem = (WorkItem) event.getProperty(WorkflowEvent.WORK_ITEM);
// your code comes here...
}
}
}
} catch(Exception e){
logger.debug(e.getMessage());
e.printStackTrace();
}
return true;
}
}