Interazione con flussi di lavoro a livello di programmazione
- Argomenti:
- Developing
Creato per:
- Developer
Quando personalizzazione ed estensione dei flussi di lavoro è possibile accedere agli oggetti del flusso di lavoro:
Utilizzo dell’API Java per i flussi di lavoro
L’API Java del flusso di lavoro è costituita dal com.adobe.granite.workflow
pacchetto e diversi pacchetti secondari. Il membro più significativo dell’API è il com.adobe.granite.workflow.WorkflowSession
classe. La WorkflowSession
class fornisce l'accesso sia agli oggetti del flusso di lavoro in fase di progettazione che di runtime:
- modelli di flusso di lavoro
- articoli 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 programmatica con i flussi di lavoro. Gli esempi seguenti illustrano come ottenere e utilizzare gli oggetti classe 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 gli script ECMA lato server. La org.apache.sling.scripting.core.ScriptHelper
la classe è immediatamente disponibile per gli script come sling
variabile.
La ScriptHelper
fornisce l'accesso al SlingHttpServletRequest
che è possibile utilizzare per ottenere WorkflowSession
oggetto; 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 utilizza intensamente l’API REST; questa pagina descrive quindi l’API REST per i flussi di lavoro.
Le seguenti azioni sono supportate con l’API REST:
- avviare o interrompere un servizio flusso di lavoro
- creare, aggiornare o eliminare modelli di flusso di lavoro
- avviare, sospendere, riprendere o interrompere le istanze del flusso di lavoro
- completare o delegare elementi di lavoro
POST
richiesta.In questa pagina si presume che AEM eseguito su localhost alla porta 4502
e che il contesto dell'installazione è " /
" (root). Se non è il caso dell’installazione, gli URI a cui si applicano le richieste HTTP devono essere adattati di conseguenza.
Rendering supportato per GET
richiede è il rendering JSON. Gli URL per GET
devono avere .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
. A 201
(CREATED
) viene inviata nuovamente con un’intestazione di posizione contenente l’URL della nuova risorsa dell’istanza del flusso di lavoro .Gestione di un’istanza di flusso di lavoro per 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
oppure ABORTED
.Se il nuovo stato non è raggiungibile (ad esempio quando si sospende un'istanza terminata) un
409
(CONFLICT
) viene inviata nuovamente al client.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 e viene creato un nuovo modello con il titolo specificato. Collegamento di una definizione di modello JSON come parametro model
crea un nuovo modello di flusso di lavoro in base alla definizione fornita.A
201
response (CREATED
) viene inviata nuovamente con un’intestazione di posizione contenente l’URL della nuova risorsa del modello di flusso di lavoro.Lo stesso accade quando una definizione del modello viene associata come parametro di file denominato
modelfile
.In entrambi i casi
model
e modelfile
un parametro aggiuntivo denominato type
è necessario per definire il formato di serializzazione. I nuovi formati di serializzazione possono essere integrati utilizzando l’API OSGI. Viene fornito un serializzatore JSON standard con il motore del flusso di lavoro. Il suo tipo è JSON. Vedi sotto per 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 nel repository.
GET
HEAD
versione del modello (definizione e metadati).PUT
HEAD
versione 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, type
è necessario come per la creazione di nuovi modelli e deve avere il valore JSON
.POST
PUT
operazioni.DELETE
POST
che contiene un X-HTTP-Method-Override
voce di intestazione con valore DELETE
saranno accettati anche come DELETE
richiesta.Esempio: nel browser, una richiesta a http://localhost:4502/var/workflow/models/publish_example.json
restituisce json
risposta 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 per versione
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/etc/workflow/models/{id}.{version}
GET
Gestione delle caselle in entrata (utente)
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 in base ai nodi successivi, definiti dal parametro route
o backroute
in caso di un passo indietro.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 WorkItem
I seguenti metodi di richiesta HTTP si applicano a:
http://localhost:4502/bin/workflow/inbox/{id}
GET
WorkItem
identificato dal relativo ID.Esempi
Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i relativi ID
Per ottenere un elenco di tutti i flussi di lavoro in esecuzione, effettua una GET per:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i loro ID - REST utilizzando curl
Esempio con curl:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
La uri
visualizzati 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"}
]
Come modificare il titolo del flusso di lavoro
Per modificare la variabile Titolo flusso di lavoro visualizzati nella Istanze scheda della console del flusso di lavoro, invia POST
comando:
-
a:
http://localhost:4502/etc/workflow/instances/{id}
-
con i seguenti parametri:
action
: il suo valore deve essere:UPDATE
workflowTitle
: titolo del flusso di lavoro
Come modificare il titolo del flusso di lavoro - REST utilizzando curl
Esempio con curl:
curl -u admin:admin -d "action=UPDATE&workflowTitle=myWorkflowTitle" http://localhost:4502/etc/workflow/instances/{id}
# for example
>[!CAUTION]
>
>AEM 6.4 has reached the end of extended support and this documentation is no longer updated. For further details, see our [technical support periods](https://helpx.adobe.com/it/support/programs/eol-matrix.html). Find the supported versions [here](https://experienceleague.adobe.com/docs/?lang=it).
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
Per ottenere un elenco di tutti i modelli di flusso di lavoro disponibili, effettua una GET per:
http://localhost:4502/etc/workflow/models.json
Come elencare tutti i modelli di flussi di lavoro - REST utilizzando curl
Esempio con curl:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Ottenimento di un oggetto WorkflowSession
La com.adobe.granite.workflow.WorkflowSession
La classe è adattabile da un javax.jcr.Session
oggetto o org.apache.sling.api.resource.ResourceResolver
oggetto.
Ottenimento di un oggetto WorkflowSession - Java
In uno script JSP (o codice Java per una classe servlet), utilizza l’oggetto richiesta HTTP per ottenere un SlingHttpServletRequest
che consente l'accesso a un ResourceResolver
oggetto. Adatta il ResourceResolver
oggetto 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
Utilizza la sling
per ottenere la variabile SlingHttpServletRequest
oggetto utilizzato per ottenere un ResourceResolver
oggetto. Adatta il ResourceResolver
dell'oggetto WorkflowSession
oggetto.
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 gli script Java ed ECMA utilizza la variabile
WorkflowSession.createNewModel
metodo . - Il comando curl accede direttamente al modello utilizzando il relativo URL.
Gli esempi utilizzati:
- Creare un modello (con l'ID
/var/workflow/models/mymodel/jcr:content/model
). - Elimina il modello.
deleted
proprietà del modello metaData
nodo figlio a true
.Durante la creazione di un nuovo modello:
-
L’editor del modello di flusso di lavoro richiede che i modelli utilizzino una specifica struttura di nodo
/var/workflow/models
. Il nodo padre del modello deve essere del tipocq:Page
averejcr:content
nodo con i seguenti valori di proprietà:sling:resourceType
:cq/workflow/components/pages/model
cq:template
:/libs/cq/workflow/templates/model
Quando crei un modello, devi prima crearlo
cq:Page
e utilizzarne il nodojcr:content
come nodo principale del nodo del modello. -
La
id
argomento che alcuni metodi richiedono per identificare il modello è il percorso assoluto del nodo del modello nel repository:/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 con curl
# deleting the model by its id
>[!CAUTION]
>
>AEM 6.4 has reached the end of extended support and this documentation is no longer updated. For further details, see our [technical support periods](https://helpx.adobe.com/it/support/programs/eol-matrix.html). Find the supported versions [here](https://experienceleague.adobe.com/docs/?lang=it).
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Filtro dei flussi di lavoro del sistema durante il controllo dello stato del flusso di lavoro
È possibile utilizzare 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 pertinenti.
You può aggiornare la configurazione OSGi Adobe PayloadMapCache del flusso di lavoro Granite specifica il flusso di lavoro Models
da considerare flussi di lavoro di sistema. 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 del Passaggio partecipante dopo un timeout
Se devi avanzare automaticamente un Partecipante passaggio che non è stato completato entro un periodo di tempo predefinito:
-
Implementa un listener di eventi OSGI per ascoltare la creazione e la modifica delle attività.
-
Specifica un timeout (scadenza), quindi crea un processo sling pianificato da attivare in quel momento.
-
Scrivi un gestore di processi che viene notificato alla scadenza del timeout e attiva il processo.
Se l'attività non è ancora stata completata, il gestore eseguirà l'azione richiesta
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 con 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
In questo modo verranno elencate 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
Vedi Come ottenere un elenco di tutti i flussi di lavoro in esecuzione con i loro 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
-
Terminazione di un'istanza di 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 progammatico) 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 con curl
-
Inserimento di elementi di lavoro dalla casella in entrata
# listing the work items curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Vengono elencati i dettagli relativi agli 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 degli 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
Ladelegatee
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 del flusso di lavoro
Utilizza il framework di eventi OSGi per ascoltare gli eventi che il com.adobe.granite.workflow.event.WorkflowEvent
la classe definisce. Questa classe fornisce anche diversi metodi utili per ottenere informazioni sull'oggetto dell'evento. Ad esempio, il getWorkItem
restituisce il WorkItem
oggetto 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;
}
}