Interazione con flussi di lavoro a livello di programmazione

Quando personalizzate ed estendete i flussi di lavoro , potete accedere agli oggetti dei flussi di lavoro:

Utilizzo dell'API Java del flusso di lavoro

L'API Java del flusso di lavoro è costituita dal com.adobe.granite.workflow pacchetto e da diversi pacchetti secondari. Il membro più significativo dell'API è la com.adobe.granite.workflow.WorkflowSession classe. La WorkflowSession classe fornisce l'accesso sia agli oggetti del flusso di lavoro di progettazione che di runtime:

  • modelli di workflow
  • elementi di lavoro
  • istanze del flusso di lavoro
  • dati flusso di lavoro
  • elementi inbox

La classe fornisce inoltre diversi metodi per intervenire nei cicli di vita del flusso di lavoro.

La tabella seguente contiene collegamenti alla documentazione di riferimento di diversi oggetti Java chiave da utilizzare per interagire in modo programmatico con i flussi di lavoro. Gli esempi seguenti illustrano come ottenere e utilizzare gli oggetti classe nel codice.

Funzioni Oggetti
Accesso a un flusso di lavoro WorkflowSession
Esecuzione e query di un'istanza del flusso di lavoro Workflow
WorkItem
WorkflowData
Gestione di un modello di workflow WorkflowModel
WorkflowNode
WorkflowTransition
Informazioni per un nodo che si trova o meno nel flusso di lavoro WorkflowStatus

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 sul lato server. La org.apache.sling.scripting.core.ScriptHelper classe è immediatamente disponibile per gli script come sling variabile.

La ScriptHelper classe fornisce l'accesso a SlingHttpServletRequest quello che è possibile utilizzare per ottenere l' WorkflowSession oggetto; ad esempio:

var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);

Utilizzo di Workflow REST API

La console Flusso di lavoro utilizza in modo significativo l’API REST; in questa pagina vengono descritte le API REST per i flussi di lavoro.

Nota

Lo strumento della riga di comando curl consente di utilizzare l'API REST del flusso di lavoro per accedere agli oggetti del flusso di lavoro e gestire i cicli di vita delle istanze. Gli esempi presenti in questa pagina dimostrano l'utilizzo dell'API REST tramite lo strumento della riga di comando curl.

Le azioni seguenti sono supportate con REST API:

Nota

Utilizzando Firebug, un'estensione Firefox per lo sviluppo Web, è possibile seguire il traffico HTTP quando la console è attiva. Ad esempio, puoi controllare i parametri e i valori inviati al server AEM con una POST richiesta.

In questa pagina si presume che AEM venga eseguito su localhost nella porta 4502 e che il contesto di installazione sia " /" (root). In caso contrario, gli URI ai quali si applicano le richieste HTTP devono essere adattati di conseguenza.

Il rendering supportato per GET le richieste è il rendering JSON. Gli URL per GET devono avere l’ .json estensione, ad esempio:

http://localhost:4502/etc/workflow.json

Gestione delle istanze del flusso di lavoro

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/etc/workflow/instances

Metodo di richiesta HTTP Azioni
GET Elenca le istanze del flusso di lavoro disponibili.
POST

Crea una nuova istanza del flusso di lavoro. I parametri sono:
- model: l’ID (URI) del rispettivo modello
di workflow - payloadType: contenente il tipo di payload (ad esempio JCR_PATH o URL).
Il payload viene inviato come parametro payload. Una 201 (CREATED) risposta viene restituita con un'intestazione di posizione contenente l'URL della nuova risorsa di istanza del flusso di lavoro.

Gestione dell’istanza del flusso di lavoro in base al relativo stato

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/etc/workflow/instances.{state}

Metodo di richiesta HTTP Azioni
GET Elenca le istanze del flusso di lavoro disponibili e i relativi stati ( RUNNING, SUSPENDEDo ABORTED COMPLETED)

Gestione di un’istanza del flusso di lavoro in base al relativo ID

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/etc/workflow/instances/{id}

Metodo di richiesta HTTP Azioni
GET Ottiene i dati delle istanze (definizione e metadati) incluso il collegamento al rispettivo modello di flusso di lavoro.
POST Modifica lo stato dell’istanza. Il nuovo stato viene inviato come parametro state e deve avere uno dei seguenti valori: RUNNING, SUSPENDEDo ABORTED.
Se il nuovo stato non è raggiungibile (ad esempio durante la sospensione di un'istanza terminata), una 409 (CONFLICT) risposta viene restituita al client.

Gestione dei modelli di workflow

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/etc/workflow/models

Metodo di richiesta HTTP Azioni
GET Elenca i modelli di flusso di lavoro disponibili.
POST Crea un nuovo modello flusso di lavoro. Se il parametro title viene inviato, viene creato un nuovo modello con il titolo specificato. Associando una definizione del modello JSON come parametro model si crea un nuovo modello di workflow in base alla definizione fornita.
Una 201 risposta (CREATED) viene restituita con un'intestazione di posizione contenente l'URL della nuova risorsa del modello di workflow.
Lo stesso accade quando una definizione del modello viene associata a un parametro di file denominato modelfile.
Sia nel caso dei model parametri che modelfile in quello dei parametri, per definire il formato di serializzazione è necessario un parametro aggiuntivo denominato type . 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. Per un esempio del formato, vedere di seguito.

Esempio: nel browser, una richiesta per http://localhost:4502/etc/workflow/models.json generare una risposta json simile a quella riportata di seguito:

[
    {"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

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502*{uri}*

Dove *{uri}* è il percorso del nodo del modello nella directory archivio.

Metodo di richiesta HTTP Azioni
GET Ottiene la HEAD versione del modello (definizione e metadati).
PUT Aggiorna la 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, è necessario un type parametro come per la creazione di nuovi modelli e deve avere il valore JSON.
POST Stesso comportamento di PUT. Necessario perché i widget AEM non supportano PUT le operazioni.
DELETE Elimina il modello. Per risolvere i problemi relativi a firewall/proxy, POST una voce di X-HTTP-Method-Override intestazione con valore DELETE verrà accettata come DELETE richiesta.

Esempio: nel browser, una richiesta di http://localhost:4502/var/workflow/models/publish_example.json restituzione di una 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 workflow per versione

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/etc/workflow/models/{id}.{version}

Metodo di richiesta HTTP Azioni
GET Ottiene i dati del modello nella versione specificata (se presente).

Gestione delle caselle in entrata (utente)

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/bin/workflow/inbox

Metodo di richiesta HTTP Azioni
GET Elenca gli elementi di lavoro che si trovano nella inbox dell'utente, identificati dalle intestazioni di autenticazione HTTP.
POST Completa l’elemento di lavoro il cui URI viene inviato come parametro item e avanza l’istanza del flusso di lavoro in base ai nodi successivi, ovvero in base al parametro route o backroute in caso di ritorno a un passo precedente.
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

Si applicano i seguenti metodi di richiesta HTTP:

http://localhost:4502/bin/workflow/inbox/{id}

Metodo di richiesta HTTP Azioni
GET Ottiene i dati (definizione e metadati) della inbox WorkItem identificati 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, eseguite un'operazione GET per:

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 con curl:

curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json

I risultati uri visualizzati possono essere utilizzati come istanza id in altri comandi; ad esempio:

[
    {"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Nota

Questo curl comando 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 del flusso di lavoro visualizzato nella scheda Istanze della console del flusso di lavoro, inviate un POST comando:

  • 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 con 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

Per ottenere un elenco di tutti i modelli di workflow disponibili, eseguite un'operazione GET per:

http://localhost:4502/etc/workflow/models.json

Come elencare tutti i modelli di workflow - REST con curl

Esempio con curl:

curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Nota

Vedere anche Gestione dei modellidi flussi di lavoro.

Ottenimento di un oggetto WorkflowSession

La com.adobe.granite.workflow.WorkflowSession classe è adattabile da un javax.jcr.Session oggetto o da un org.apache.sling.api.resource.ResourceResolver oggetto.

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 SlingHttpServletRequest oggetto, che fornisce l'accesso a un ResourceResolver oggetto. Adattare l' ResourceResolver oggetto 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 sling variabile per ottenere l' SlingHttpServletRequest oggetto utilizzato per ottenere un ResourceResolver oggetto. Adattare l' ResourceResolver oggetto all' 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 workflow:

  • Il codice per lo script Java ed ECMA utilizza il WorkflowSession.createNewModel metodo .
  • Il comando curl accede direttamente al modello utilizzando il relativo URL.

Gli esempi utilizzati:

  1. Creare un modello (con l'ID /var/workflow/models/mymodel/jcr:content/model).
  2. Eliminare il modello.
Nota

L'eliminazione del modello imposta la deleted proprietà del nodo figlio del modello su metaData su true.

L'eliminazione non rimuove il nodo del modello.

Durante la creazione di un nuovo modello:

  • L'editor del modello di workflow richiede che i modelli utilizzino una specifica struttura di nodi sotto /var/workflow/models. Il nodo padre del modello deve essere di tipo cq:Page con un jcr:content nodo 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 questo cq:Page nodo e utilizzare il relativo jcr:content nodo come elemento padre del nodo del modello.

  • L' id argomento 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

    Nota

    Vedere Come elencare tutti i modellidi flussi di lavoro.

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 workflow - REST tramite curl

# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Nota

A causa del livello di dettaglio richiesto, il curl non è considerato pratico per creare e/o leggere un modello.

Filtrare i flussi di lavoro del sistema durante il controllo dello stato del flusso di lavoro

Potete utilizzare l'API WorkflowStatus per recuperare informazioni sullo stato del flusso di lavoro di un nodo.

I diversi metodi hanno il parametro:

excludeSystemWorkflows

Questo parametro può essere impostato per true indicare che i flussi di lavoro del sistema devono essere esclusi dai risultati rilevanti.

È possibile aggiornare la configurazione OSGi di Adobe Granite Workflow PayloadMapCache che specifica il flusso di lavoro Models da considerare come 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 passo partecipante dopo un timeout

Se dovete far avanzare automaticamente un passaggio Partecipante che non è stato completato entro un tempo predefinito, potete:

  1. Implementare un listener di eventi OSGI per ascoltare la creazione e la modifica delle attività.

  2. Specificate un timeout (scadenza), quindi create un processo di sling pianificato da attivare in quel momento.

  3. Scrivete un gestore di processi a cui verrà notificato il momento della scadenza del timeout e che attiva il processo.

    Se l'attività non è ancora stata completata, il gestore eseguirà l'azione richiesta.

Nota

Le azioni da intraprendere devono essere chiaramente definite per poter utilizzare tale approccio.

Interazione con le istanze del flusso di lavoro

Di seguito sono riportati alcuni esempi di base su come interagire (in modo progammatico) 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/jcr:content/model&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
    

    Vengono 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"}
    ]
    
    Nota

    Vedere 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
    
  • Terminazione 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 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 utilizzando curl

  • Elenco degli 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 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
    
    Nota

    L' delegatee opzione deve essere 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

Utilizzate il framework di eventi OSGi per ascoltare gli eventi definiti dalla com.adobe.granite.workflow.event.WorkflowEvent classe. Questa classe fornisce anche diversi metodi utili per ottenere informazioni sull'oggetto dell'evento. Ad esempio, il getWorkItem metodo restituisce l' 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;
 }
}

In questa pagina