Interagir avec les workflows par programmation interacting-with-workflows-programmatically
Lorsque vous personnalisez et optimisez vos workflows vous pouvez accéder aux objets de workflow :
Utilisation de l’API Java Workflow using-the-workflow-java-api
L’API Java Workflow se compose du package com.adobe.granite.workflow
et de plusieurs sous-packages. L’élément le plus important de l’API est la classe com.adobe.granite.workflow.WorkflowSession
. La classe WorkflowSession
permet d’accéder aux objets de workflow au moment de la conception et de l’exécution :
- modèles de workflow
- éléments de travail
- instances de workflow
- données de workflow
- éléments de boîte de réception
La classe fournit également plusieurs méthodes pour intervenir dans les cycles de vie des workflows.
Le tableau suivant fournit des liens vers la documentation de référence de plusieurs objets Java clés à utiliser lors de l’interaction par programmation avec des workflows. Les exemples suivants montrent comment obtenir et utiliser les objets de classe dans le code.
Obtention d’objets de workflow dans des scripts ECMA obtaining-workflow-objects-in-ecma-scripts
Comme indiqué dans la section Recherche du script, AEM (via Apache Sling) fournit un moteur de script ECMA qui exécute des scripts ECMA côté serveur. La classe org.apache.sling.scripting.core.ScriptHelper
est mise immédiatement à la disposition de vos scripts en tant que variable sling
.
La classe ScriptHelper
permet d’accéder à l’objet SlingHttpServletRequest
que vous pouvez utiliser pour obtenir finalement l’objet WorkflowSession
; par exemple :
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Utilisation de l’API REST Workflow using-the-workflow-rest-api
La console Workflow fait un usage intensif de l’API REST ; cette page décrit donc l’API REST pour les workflows.
Les actions suivantes sont prises en charge avec l’API REST :
- démarrer ou arrêter un service de workflow
- créer, mettre à jour ou supprimer des modèles de workflow
- Démarrer, interrompre, reprendre ou mettre fin à des instances de workflow
- terminer ou déléguer des éléments de travail
POST
.Dans cette page, on part du principe qu’AEM s’exécute sur localhost sur le port 4502
et que le contexte d’installation est « /
» (racine). Si ce n’est pas le cas de votre installation, les URI auxquelles les requêtes HTTP s’appliquent doivent être adaptées en conséquence.
Le rendu pris en charge pour les requêtes GET
est de type JSON. Les URL relatives à GET
doivent avoir l’extension .json
; par exemple :
http://localhost:4502/etc/workflow.json
Gérer des instances de workflow managing-workflow-instances
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/etc/workflow/instances
Gérer une instance de workflow par son état managing-a-workflow-instance-by-its-state
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/etc/workflow/instances.{state}
GET
RUNNING
, SUSPENDED
, ABORTED
ou COMPLETED
).Gérer une instance de workflow par son identifiant managing-a-workflow-instance-by-its-id
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/etc/workflow/instances/{id}
Gestion de modèles de workflow managing-workflow-models
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/etc/workflow/models
Exemple : dans le navigateur, une requête adressée à http://localhost:4502/etc/workflow/models.json
génère une réponse json semblable à ce qui suit :
[
{"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"}
]
Gérer un modèle de workflow spécifique managing-a-specific-workflow-model
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502*{uri}*
Où *{uri}*
est le chemin d’accès au nœud de modèle dans le référentiel.
Exemple : dans le navigateur, une requête adressée à http://localhost:4502/var/workflow/models/publish_example.json
renvoie une réponse json
semblable au code suivant :
{
"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":
{
}
}
]}
Gestion d’un modèle de workflow en fonction de sa version managing-a-workflow-model-by-its-version
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/etc/workflow/models/{id}.{version}
GET
Gestion de boîtes de réception (utilisateur) managing-user-inboxes
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/bin/workflow/inbox
Gérer une boîte de réception (utilisateur) par l’identifiant de l’élément de travail managing-a-user-inbox-by-the-workitem-id
Les méthodes de requête HTTP suivantes s’appliquent à :
http://localhost:4502/bin/workflow/inbox/{id}
GET
WorkItem
de la boîte de réception identifié par son ID.Exemples examples
Obtention d’une liste de tous les workflows en cours d’exécution avec leurs ID how-to-get-a-list-of-all-running-workflows-with-their-ids
Pour obtenir la liste de tous les workflows en cours d’exécution, effectuez une requête GET pour :
http://localhost:4502/etc/workflow/instances.RUNNING.json
Obtenir une liste de tous les workflows en cours d’exécution avec leurs ID - REST à l’aide de cURL how-to-get-a-list-of-all-running-workflows-with-their-ids-rest-using-curl
Exemple à l’aide de cURL :
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
L’uri
affichée dans les résultats peut être utilisée comme id
d’instance dans d’autres commandes. Par exemple :
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
curl
peut être utilisée avec n’importe quel statut de workflow à la place de RUNNING
.Comment modifier le titre du workflow how-to-change-the-workflow-title
Pour modifier le Titre du workflow affiché dans l’onglet Instances de la console Workflow, envoyez une commande POST
:
-
vers :
http://localhost:4502/etc/workflow/instances/{id}
-
avec les paramètres suivants :
action
: sa valeur doit êtreUPDATE
.workflowTitle
: titre du workflow
Modification du titre du workflow - REST à l’aide de cURL how-to-change-the-workflow-title-rest-using-curl
Exemple à l’aide de 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
Liste de tous les modèles de workflow how-to-list-all-workflow-models
Pour obtenir la liste de tous les modèles de workflow disponibles, effectuez une requête GET pour :
http://localhost:4502/etc/workflow/models.json
Créer un liste de tous les modèles de processus - REST à l’aide de cURL how-to-list-all-workflow-models-rest-using-curl
Exemple à l’aide de cURL :
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Obtention d’un objet WorkflowSession obtaining-a-workflowsession-object
La classe com.adobe.granite.workflow.WorkflowSession
peut être adaptée à partir d’un objet javax.jcr.Session
ou org.apache.sling.api.resource.ResourceResolver
.
Obtention d’un objet WorkflowSession – Java obtaining-a-workflowsession-object-java
Dans un script JSP (ou un code Java pour une classe servlet), utilisez l’objet de requête HTTP pour obtenir un objet SlingHttpServletRequest
qui permet d’accéder à un objet ResourceResolver
. Adaptez l’objet ResourceResolver
en 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);
%>
Obtention d’un objet WorkflowSession – Script ECMA obtaining-a-workflowsession-object-ecma-script
Utilisez la variable sling
pour récupérer l’objet SlingHttpServletRequest
que vous utilisez pour obtenir un objet ResourceResolver
. Adaptez l’objet ResourceResolver
en objet WorkflowSession
.
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Créer, lire ou supprimer des modèles de workflow creating-reading-or-deleting-workflow-models
Les exemples suivants montrent comment accéder aux modèles de workflow :
- Le code pour les scripts Java et ECMA utilise la méthode
WorkflowSession.createNewModel
. - La commande curl accède directement au modèle à l’aide de son URL.
Voici quelques exemples :
- créent un modèle (avec l’ID
/var/workflow/models/mymodel/jcr:content/model
) ; - suppriment le modèle.
deleted
du nœud enfant metaData
du modèle sur true
.Lors de la création d’un modèle :
-
L’éditeur de modèle de workflow exige que les modèles utilisent une structure de nœud spécifique sous
/var/workflow/models
. Le nœud parent du modèle doit être de typecq:Page
avec un nœudjcr:content
présentant les valeurs de propriété suivantes :sling:resourceType
:cq/workflow/components/pages/model
cq:template
:/libs/cq/workflow/templates/model
Lorsque vous créez un modèle, vous devez d’abord créer ce nœud
cq:Page
et utiliser son nœudjcr:content
comme parent du nœud de modèle. -
L’argument
id
requis par certaines méthodes pour identifier le modèle est le chemin d’accès absolu du modèle de nœud dans le référentiel :/var/workflow/models/<*model_name>*/jcr:content/model
note note NOTE Consultez la section Comment répertorier tous les modèles de workflow.
Créer, lire ou supprimer des modèles de workflow - Java creating-reading-or-deleting-workflow-models-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);
%>
Créer, lire ou supprimer des modèles de workflow - Script ECMA creating-reading-or-deleting-workflow-models-ecma-script
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);
Supprimer un modèle de workflow - REST à l’aide de curl deleting-a-workflow-model-rest-using-curl
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Filtrer les workflows système lors de la vérification du statut du workflow filtering-out-system-workflows-when-checking-workflow-status
Vous pouvez utiliser l’API WorkflowStatus pour récupérer des informations sur le statut des workflows d’un nœud.
Plusieurs méthodes sont associées au paramètre :
excludeSystemWorkflows
Ce paramètre peut être défini sur true
pour indiquer que les workflows système doivent être exclus des résultats.
Vous pouvez mettre à jour la configuration OSGi Adobe Granite Workflow PayloadMapCache qui spécifie les Models
modèles de workflow à prendre en compte en tant que workflows système. Les modèles de workflow (d’exécution) par défaut sont les suivants :
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
Avance automatique de l’étape de participant après un délai d’expiration auto-advance-participant-step-after-a-timeout
Si vous devez avancer automatiquement une étape Participant qui n’a pas été effectuée dans un délai prédéfini, vous pouvez :
-
Implémenter un listener d’événement OSGI pour écouter la création et la modification de tâches.
-
Spécifier un délai d’expiration (échéance), puis créer un traitement sling planifié à déclencher à ce moment-là.
-
Créez un gestionnaire de tâches qui est averti lors du dépassement du délai et qui déclenche la tâche.
Ce gestionnaire exécutera l’action requise sur la tâche si cette dernière n’est pas encore terminée.
Interaction avec des instances de workflow interacting-with-workflow-instances
Vous trouverez ci-dessous des exemples de base sur la façon d’interagir (par programmation) avec des instances de workflow.
Interaction avec des instances de workflow – Java interacting-with-workflow-instances-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);
Interaction avec des instances de workflow – Script ECMA interacting-with-workflow-instances-ecma-script
// 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);
Interaction avec des instances de workflow – REST avec curl interacting-with-workflow-instances-rest-using-curl
-
Démarrage d’un workflow
code language-shell # 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
-
Liste des instances
code language-shell # listing the instances curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Toutes les instances seront répertoriées, par exemple :
code language-shell [ {"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"} ,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"} ]
note note NOTE Consultez la section Comment obtenir la liste de tous les workflow actifs avec leurs ID pour répertorier les instances qui présentent un statut spécifique. -
Suspension d’un workflow
code language-shell # 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
-
Reprise d’un workflow
code language-shell # 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
-
Arrêt d’une instance de workflow
code language-shell # 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
Interaction avec des éléments de travail interacting-with-work-items
Vous trouverez ci-dessous des exemples de base sur la manière d’interagir (par programmation) avec des éléments de travail.
Interaction avec des éléments de travail - Java interacting-with-work-items-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));
Interaction avec des éléments de travail - Script ECMA interacting-with-work-items-ecma-script
// 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));
Interaction avec des éléments de travail - REST à l’aide de cURL interacting-with-work-items-rest-using-curl
-
Liste des éléments de travail de la boîte de réception
code language-shell # listing the work items curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Les détails des éléments de travail actuellement présents dans la boîte de réception sont répertoriés, par exemple :
code language-shell [{ "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" }
-
Délégation d’éléments de travail
code language-xml # 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 note NOTE Le delegatee
doit être une option valide pour l’étape de workflow. -
Réalisation ou progression d’éléments de travail à l’étape suivante
code language-xml # 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
Écouter les événements de workflow listening-for-workflow-events
Utilisez le framework d’événement OSGi pour écouter les événements définis par la classe com.adobe.granite.workflow.event.WorkflowEvent
. Cette classe propose également plusieurs méthodes utiles pour obtenir des informations sur le sujet de l’événement. La méthode getWorkItem
, par exemple, renvoie l’objet WorkItem
de l’élément de travail qui est impliqué dans l’événement.
L’exemple de code suivant définit un service qui écoute les événements de workflow et exécute les tâches selon le type d’événement.
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;
}
}