Interazione con i flussi di lavoro a livello di programmazione
- Argomenti:
- Sviluppo
Creato per:
- Sviluppatore
Quando personalizzi ed estendi i flussi di lavoro puoi accedere agli oggetti del flusso di lavoro:
Utilizzo dell’API Java del flusso di lavoro
L'API Java del flusso di lavoro è costituita dal pacchetto com.adobe.granite.workflow
e da diversi pacchetti secondari. Il membro più significativo dell'API è la classe com.adobe.granite.workflow.WorkflowSession
. La classe WorkflowSession
consente di accedere sia agli oggetti del flusso di lavoro in fase di progettazione che a quelli di runtime:
- modelli di workflow
- elementi di lavoro
- istanze del flusso di lavoro
- dati del flusso di lavoro
- elementi casella in entrata
La classe fornisce anche diversi metodi per intervenire nei cicli di vita del flusso di lavoro.
La tabella seguente fornisce collegamenti alla documentazione di riferimento di diversi oggetti Java chiave da utilizzare durante l’interazione a livello di programmazione con i flussi di lavoro. Negli esempi seguenti viene illustrato come ottenere e utilizzare gli oggetti class nel codice.
Ottenimento di oggetti del flusso di lavoro negli script ECMA
Come descritto in Individuazione dello script, AEM (tramite Apache Sling) fornisce un motore di script ECMA che esegue script ECMA lato server. La classe org.apache.sling.scripting.core.ScriptHelper
è immediatamente disponibile per gli script come variabile sling
.
La classe ScriptHelper
fornisce l'accesso a SlingHttpServletRequest
che è possibile utilizzare per ottenere l'oggetto WorkflowSession
, ad esempio:
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Utilizzo dell’API REST del flusso di lavoro
La console Flusso di lavoro fa un uso intensivo dell’API REST; pertanto questa pagina descrive l’API REST per i flussi di lavoro.
Con l’API REST sono supportate le seguenti azioni:
- avviare o arrestare un servizio del flusso di lavoro
- creare, aggiornare o eliminare modelli di flusso di lavoro
- avviare, sospendere, riprendere o terminare istanze del flusso di lavoro
- completare o delegare elementi di lavoro
POST
.In questa pagina si presume che AEM venga eseguito su localhost alla porta 4502
e che il contesto di installazione sia " /
" (radice). In caso contrario, è necessario adattare di conseguenza gli URI a cui si applicano le richieste HTTP.
Il rendering supportato per GET
richieste è il rendering JSON. Gli URL per GET
devono avere l'estensione .json
, ad esempio:
http://localhost:4502/etc/workflow.json
Gestione delle istanze dei flussi di lavoro
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/instances
GET
POST
-
model
: l'ID (URI) del rispettivo modello di flusso di lavoro-
payloadType
: contenente il tipo di payload (ad esempio, JCR_PATH
o URL).Il payload viene inviato come parametro
payload
. Viene inviata nuovamente una risposta 201
(CREATED
) con un'intestazione di posizione contenente l'URL della nuova risorsa istanza del flusso di lavoro.Gestione di un’istanza di flusso di lavoro in base al suo stato
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/instances.{state}
GET
RUNNING
, SUSPENDED
, ABORTED
o COMPLETED
)Gestione di un’istanza di flusso di lavoro per il relativo ID
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/instances/{id}
GET
POST
state
e deve avere uno dei seguenti valori: RUNNING
, SUSPENDED
o ABORTED
.Se il nuovo stato non è raggiungibile (ad esempio, quando si sospende un'istanza terminata), viene inviata nuovamente al client una risposta
409
(CONFLICT
).Gestione dei modelli di flussi di lavoro
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/models
GET
POST
title
viene inviato, viene creato un nuovo modello con il titolo specificato. Quando si allega una definizione di modello JSON come parametro model
, viene creato un nuovo modello di flusso di lavoro in base alla definizione fornita.Viene inviata una risposta
201
(CREATED
) con un'intestazione di posizione contenente l'URL della nuova risorsa modello flusso di lavoro.Lo stesso accade quando una definizione di modello viene allegata come parametro di file denominato
modelfile
.In entrambi i casi dei parametri
model
e modelfile
, è necessario un parametro aggiuntivo denominato type
per definire il formato di serializzazione. È possibile integrare nuovi formati di serializzazione utilizzando l’API OSGI. Con il motore del flusso di lavoro viene fornito un serializzatore JSON standard. Il tipo è JSON. Di seguito è riportato un esempio del formato.Esempio: nel browser, una richiesta a http://localhost:4502/etc/workflow/models.json
genera una risposta JSON simile alla seguente:
[
{"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"}
]
Gestione di un modello di flusso di lavoro specifico
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502*{uri}*
Dove *{uri}*
è il percorso del nodo del modello nell'archivio.
GET
HEAD
del modello (definizione e metadati).PUT
HEAD
del modello (crea una nuova versione).La definizione completa del modello per la nuova versione del modello deve essere aggiunta come parametro denominato
model
. Inoltre, è necessario un parametro type
come durante la creazione di nuovi modelli e deve avere il valore JSON
.POST
PUT
.DELETE
POST
contenente una voce di intestazione X-HTTP-Method-Override
con valore DELETE
verrà accettata anche come richiesta DELETE
.Esempio: nel browser, una richiesta a http://localhost:4502/var/workflow/models/publish_example.json
restituisce una risposta json
simile al seguente codice:
{
"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":
{
}
}
]}
Gestione di un modello di flusso di lavoro in base alla sua versione
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/models/{id}.{version}
GET
Gestione delle caselle in entrata (degli utenti)
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/bin/workflow/inbox
GET
POST
item
e avanza l'istanza del flusso di lavoro corrispondente ai nodi successivi, definita dal parametro route
o backroute
se si torna indietro di un passaggio.Se il parametro
delegatee
viene inviato, l'elemento di lavoro identificato dal parametro item
viene delegato al partecipante specificato.Gestione di una casella in entrata (utente) tramite l’ID elemento di lavoro
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/bin/workflow/inbox/{id}
GET
WorkItem
identificata dal relativo ID.Esempi
Ottenere un elenco di tutti i flussi di lavoro in esecuzione con i relativi ID
GET Per ottenere un elenco di tutti i flussi di lavoro in esecuzione, eseguire una delle operazioni seguenti:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i relativi ID - REST utilizzando CURL
Esempio utilizzando curl:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
Il uri
visualizzato nei risultati può essere utilizzato come istanza id
in altri comandi, ad esempio:
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
curl
può essere utilizzato con qualsiasi stato del flusso di lavoro al posto di RUNNING
.Come modificare il titolo del flusso di lavoro
Per modificare il Titolo flusso di lavoro visualizzato nella scheda Istanze della console del flusso di lavoro, invia un comando POST
:
-
a:
http://localhost:4502/etc/workflow/instances/{id}
-
con i seguenti parametri:
action
: il valore deve essere:UPDATE
workflowTitle
: titolo del flusso di lavoro
Come modificare il Titolo del flusso di lavoro - REST utilizzando CURL
Esempio utilizzando 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
Come elencare tutti i modelli di flussi di lavoro
GET Per ottenere un elenco di tutti i modelli di flusso di lavoro disponibili, eseguire una delle operazioni seguenti:
http://localhost:4502/etc/workflow/models.json
Come elencare tutti i modelli di flussi di lavoro - REST utilizzando CURL
Esempio utilizzando curl:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Ottenimento di un oggetto WorkflowSession
La classe com.adobe.granite.workflow.WorkflowSession
è adattabile da un oggetto javax.jcr.Session
o org.apache.sling.api.resource.ResourceResolver
.
Ottenimento di un oggetto WorkflowSession: Java
In uno script JSP (o codice Java per una classe servlet), utilizzare l'oggetto richiesta HTTP per ottenere un oggetto SlingHttpServletRequest
, che fornisce accesso a un oggetto ResourceResolver
. Adattare l'oggetto ResourceResolver
a 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);
%>
Ottenimento di un oggetto WorkflowSession: script ECMA
Utilizzare la variabile sling
per ottenere l'oggetto SlingHttpServletRequest
utilizzato per ottenere un oggetto ResourceResolver
. Adattare l'oggetto ResourceResolver
all'oggetto WorkflowSession
.
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Creazione, lettura o eliminazione di modelli di flussi di lavoro
Gli esempi seguenti mostrano come accedere ai modelli di flusso di lavoro:
- Il codice per lo script Java ed ECMA utilizza il metodo
WorkflowSession.createNewModel
. - Il comando curl accede al modello direttamente dal relativo URL.
Gli esempi utilizzati:
- Creare un modello (con ID
/var/workflow/models/mymodel/jcr:content/model
). - Elimina il modello.
deleted
del nodo figlio metaData
del modello su true
.Durante la creazione di un modello:
-
L'editor modelli di flusso di lavoro richiede che i modelli utilizzino una struttura di nodo specifica sotto
/var/workflow/models
. Il nodo padre del modello deve essere di tipocq:Page
con un nodojcr:content
con i seguenti valori di proprietà:sling:resourceType
:cq/workflow/components/pages/model
cq:template
:/libs/cq/workflow/templates/model
Quando si crea un modello, è innanzitutto necessario creare il nodo
cq:Page
e utilizzare il relativo nodojcr:content
come nodo principale del nodo del modello. -
L'argomento
id
richiesto da alcuni metodi per identificare il modello è il percorso assoluto del nodo del modello nell'archivio:/var/workflow/models/<*model_name>*/jcr:content/model
Creazione, lettura o eliminazione di modelli di flussi di lavoro - Java
<%@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);
%>
Creazione, lettura o eliminazione di modelli di flussi di lavoro - Script ECMA
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);
Eliminazione di un modello di flusso di lavoro - REST mediante curl
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Filtraggio dei flussi di lavoro di sistema durante la verifica dello stato del flusso di lavoro
È possibile utilizzare l'API WorkflowStatus per recuperare informazioni sullo stato del flusso di lavoro di un nodo.
Diversi metodi hanno il parametro:
excludeSystemWorkflows
Questo parametro può essere impostato su true
per indicare che i flussi di lavoro di sistema devono essere esclusi dai risultati rilevanti.
È possibile aggiornare la configurazione OSGi Adobe Granite Workflow PayloadMapCache che specifica il flusso di lavoro Models
da considerare come flussi di lavoro di . I modelli di flusso di lavoro predefiniti (runtime) sono:
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
Avanzamento automatico passaggio partecipante dopo un timeout
Se devi far avanzare automaticamente un passaggio Partecipante che non è stato completato entro un tempo predefinito, puoi:
-
Implementa un listener di eventi OSGI per l’ascolto durante la creazione e la modifica delle attività.
-
Specifica un timeout (scadenza), quindi crea un processo sling pianificato da attivare in tale momento.
-
Scrivi un gestore di processi che riceve una notifica alla scadenza del timeout e attiva il processo.
Questo gestore esegue l'azione richiesta sull'attività se questa non è ancora completata
Interazione con le istanze del flusso di lavoro
Di seguito sono riportati alcuni esempi di base su come interagire (in modo programmatico) con le istanze del flusso di lavoro.
Interazione con le istanze del flusso di lavoro - Java
// 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);
Interazione con le istanze del flusso di lavoro - Script ECMA
// 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);
Interazione con le istanze del flusso di lavoro - REST tramite curl
-
Avvio di un flusso di lavoro
# 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
-
Elenco delle istanze
# listing the instances curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Elencherà tutte le istanze; ad esempio:
[ {"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"} ,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"} ]
NOTE
Consulta Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i relativi ID per elencare le istanze con uno stato specifico. -
Sospensione di un flusso di lavoro
# 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
-
Ripresa di un flusso di lavoro
# 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
-
Chiusura di un'istanza del flusso di lavoro
# 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
Interazione con gli elementi di lavoro
Di seguito sono riportati alcuni esempi di base su come interagire (in modo programmatico) con gli elementi di lavoro.
Interazione con gli elementi di lavoro - Java
// 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));
Interazione con gli elementi di lavoro - Script ECMA
// 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));
Interazione con gli elementi di lavoro - REST mediante curl
-
Elencazione di elementi di lavoro dalla cartella Posta in arrivo
# listing the work items curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Verranno elencati i dettagli degli elementi di lavoro attualmente presenti nella casella in entrata, ad esempio:
[{ "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" }
-
Delega di elementi di lavoro
# 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
NOTE
delegatee
deve essere un'opzione valida per il passaggio del flusso di lavoro. -
Completamento o avanzamento degli elementi di lavoro al passaggio successivo
# 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
Ascolto degli eventi dei flussi di lavoro
Utilizzare il framework eventi OSGi per rilevare gli eventi definiti dalla classe com.adobe.granite.workflow.event.WorkflowEvent
. Questa classe fornisce anche diversi metodi utili per ottenere informazioni sull'oggetto dell'evento. Il metodo getWorkItem
, ad esempio, restituisce l'oggetto WorkItem
per l'elemento di lavoro coinvolto nell'evento.
Il codice di esempio seguente definisce un servizio che ascolta gli eventi del flusso di lavoro ed esegue le attività in base al tipo di evento.
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;
}
}