Interação programática com fluxos de trabalho
- Aplica-se a:
- Experience Manager 6.5
- Tópicos:
- Desenvolvimento
Criado para:
- Desenvolvedor
Ao personalizar e estender seus fluxos de trabalho, você pode acessar objetos de fluxo de trabalho:
Uso da API Java do fluxo de trabalho
A API Java do fluxo de trabalho consiste no pacote com.adobe.granite.workflow
e em vários pacotes secundários. O membro mais significativo da API é a classe com.adobe.granite.workflow.WorkflowSession
. A classe WorkflowSession
fornece acesso aos objetos de fluxo de trabalho de tempo de design e de tempo de execução:
- modelos de fluxo de trabalho
- itens de trabalho
- instâncias de fluxo de trabalho
- dados de fluxo de trabalho
- itens da caixa de entrada
A classe também fornece vários métodos para intervir nos ciclos de vida do fluxo de trabalho.
A tabela a seguir fornece links para a documentação de referência de vários objetos Java principais para usar ao interagir programaticamente com workflows. Os exemplos a seguir demonstram como obter e usar os objetos de classe no código.
Obtenção de Objetos de Workflow em Scripts ECMA
Conforme descrito em Localizando o Script, o AEM (via Apache Sling) fornece um mecanismo de script ECMA que executa scripts ECMA do lado do servidor. A classe org.apache.sling.scripting.core.ScriptHelper
está imediatamente disponível para seus scripts como a variável sling
.
A classe ScriptHelper
fornece acesso ao SlingHttpServletRequest
que você pode usar para eventualmente obter o objeto WorkflowSession
; por exemplo:
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Uso da API REST do workflow
O console Fluxo de trabalho faz grande uso da REST API; portanto, esta página descreve a REST API para fluxos de trabalho.
As seguintes ações são compatíveis com a REST API:
- iniciar ou parar um serviço de fluxo de trabalho
- criar, atualizar ou excluir modelos de fluxo de trabalho
- iniciar, suspender, retomar ou encerrar instâncias de fluxo de trabalho
- concluir ou delegar itens de trabalho
POST
.Nesta página, presume-se que o AEM seja executado no host local na porta 4502
e que o contexto de instalação seja " /
" (raiz). Se não for o caso de sua instalação, os URIs, aos quais as solicitações HTTP se aplicam, precisam ser adaptados adequadamente.
A renderização com suporte para GET
solicitações é a renderização JSON. As URLs de GET
devem ter a extensão .json
, por exemplo:
http://localhost:4502/etc/workflow.json
Gerenciamento de instâncias de fluxo de trabalho
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances
GET
POST
-
model
: a ID (URI) do respectivo modelo de fluxo de trabalho-
payloadType
: contendo o tipo de carga (por exemplo, JCR_PATH
ou URL).A carga é enviada como parâmetro
payload
. Uma resposta 201
(CREATED
) é enviada de volta com um cabeçalho de local contendo a URL do novo recurso de instância de fluxo de trabalho.Gerenciar uma instância de fluxo de trabalho por seu estado
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances.{state}
GET
RUNNING
, SUSPENDED
, ABORTED
ou COMPLETED
)Gerenciamento de uma instância de fluxo de trabalho por sua ID
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances/{id}
GET
POST
state
e deve ter um dos seguintes valores: RUNNING
, SUSPENDED
ou ABORTED
.Se o novo estado não estiver acessível (por exemplo, ao suspender uma instância terminada) uma resposta
409
(CONFLICT
) será enviada de volta ao cliente.Gerenciamento de modelos de fluxo de trabalho
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/models
GET
POST
title
for enviado, um novo modelo será criado com o título especificado. Anexar uma definição de modelo JSON como parâmetro model
cria um novo modelo de fluxo de trabalho de acordo com a definição fornecida.Uma resposta de
201
(CREATED
) é enviada de volta com um cabeçalho de local contendo a URL do novo recurso de modelo de fluxo de trabalho.O mesmo acontece quando uma definição de modelo é anexada como um parâmetro de arquivo chamado
modelfile
.Em ambos os casos dos parâmetros
model
e modelfile
, um parâmetro adicional chamado type
é necessário para definir o formato de serialização. Novos formatos de serialização podem ser integrados usando a API OSGI. Um serializador JSON padrão é fornecido com o mecanismo de fluxo de trabalho. Seu tipo é JSON. Veja abaixo um exemplo do formato.Exemplo: no navegador, uma solicitação para http://localhost:4502/etc/workflow/models.json
gera uma resposta json semelhante à seguinte:
[
{"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"}
]
Gerenciamento de um modelo de fluxo de trabalho específico
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502*{uri}*
Onde *{uri}*
é o caminho para o nó do modelo no repositório.
GET
HEAD
do modelo (definição e metadados).PUT
HEAD
do modelo (cria uma nova versão).A definição completa do modelo para a nova versão do modelo deve ser adicionada como um parâmetro chamado
model
. Além disso, um parâmetro type
é necessário como ao criar novos modelos e precisa ter o valor JSON
.POST
PUT
.DELETE
POST
que contenha uma entrada de cabeçalho X-HTTP-Method-Override
com valor DELETE
também será aceito como solicitação DELETE
.Exemplo: no navegador, uma solicitação para http://localhost:4502/var/workflow/models/publish_example.json
retorna uma resposta json
que é semelhante ao seguinte código:
{
"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":
{
}
}
]}
Gerenciamento de um modelo de fluxo de trabalho por sua versão
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/models/{id}.{version}
GET
Gerenciar Caixas De Entrada (Usuário)
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/bin/workflow/inbox
GET
POST
item
e avança a instância de fluxo de trabalho de acordo para os próximos nós, que são definidos pelo parâmetro route
ou backroute
se houver um retrocesso de uma etapa.Se o parâmetro
delegatee
for enviado, o item de trabalho identificado pelo parâmetro item
será delegado ao participante especificado.Gerenciar uma caixa de entrada (usuário) pelo ID do item de trabalho
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/bin/workflow/inbox/{id}
GET
WorkItem
identificados por sua ID.Exemplos
Como obter uma lista de todos os fluxos de trabalho em execução com suas IDs
Para obter uma lista de todos os workflows em execução, faça uma GET para:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Como obter uma lista de todos os fluxos de trabalho em execução com suas IDs - REST usando curl
Exemplo usando curl:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
A uri
exibida nos resultados pode ser usada como a instância id
em outros comandos; por exemplo:
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Como alterar o título do fluxo de trabalho
Para alterar o Título do Fluxo de Trabalho exibido na guia Instâncias do console de fluxo de trabalho, envie um comando POST
:
-
para:
http://localhost:4502/etc/workflow/instances/{id}
-
com os seguintes parâmetros:
action
: seu valor deve ser:UPDATE
workflowTitle
: o título do fluxo de trabalho
Como alterar o título do fluxo de trabalho - REST usando curl
Exemplo usando 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
Como listar todos os modelos de fluxo de trabalho
Para obter uma lista de todos os modelos de fluxo de trabalho disponíveis, faça uma GET para:
http://localhost:4502/etc/workflow/models.json
Como listar todos os modelos de fluxo de trabalho - REST usando curl
Exemplo usando curl:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Obter um objeto WorkflowSession
A classe com.adobe.granite.workflow.WorkflowSession
é adaptável de um objeto javax.jcr.Session
ou de um objeto org.apache.sling.api.resource.ResourceResolver
.
Obter um objeto WorkflowSession - Java
Em um script JSP (ou código Java para uma classe de servlet), use o objeto de solicitação HTTP para obter um objeto SlingHttpServletRequest
, que fornece acesso a um objeto ResourceResolver
. Adapte o objeto 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);
%>
Obter um objeto WorkflowSession - Script ECMA
Use a variável sling
para obter o objeto SlingHttpServletRequest
usado para obter um objeto ResourceResolver
. Adapte o objeto ResourceResolver
ao objeto WorkflowSession
.
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
Criação, leitura ou exclusão de modelos de fluxo de trabalho
Os seguintes exemplos mostram como acessar modelos de fluxo de trabalho:
- O código do script Java e ECMA usa o método
WorkflowSession.createNewModel
. - O comando curl acessa o modelo diretamente usando sua URL.
Os exemplos usados:
- Criar um modelo (com a ID
/var/workflow/models/mymodel/jcr:content/model
). - Exclua o modelo.
deleted
do nó filho metaData
do modelo como true
.Ao criar um modelo:
-
O editor de modelo de fluxo de trabalho exige que os modelos usem uma estrutura de nó específica abaixo de
/var/workflow/models
. O nó pai do modelo deve ser do tipocq:Page
com um nójcr:content
com os seguintes valores de propriedade:sling:resourceType
:cq/workflow/components/pages/model
cq:template
:/libs/cq/workflow/templates/model
Ao criar um modelo, você deve primeiro criar este nó
cq:Page
e usar seu nójcr:content
como o pai do nó do modelo. -
O argumento
id
que alguns métodos exigem para identificar o modelo é o caminho absoluto do nó do modelo no repositório:/var/workflow/models/<*model_name>*/jcr:content/model
NOTE
Criação, leitura ou exclusão de modelos de fluxo de trabalho - 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);
%>
Criação, Leitura ou Exclusão de Modelos de Workflow - 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);
Excluir um modelo de fluxo de trabalho - REST usando curl
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Filtrar fluxos de trabalho do sistema ao verificar o status do fluxo de trabalho
Você pode usar a API WorkflowStatus para recuperar informações sobre o status do fluxo de trabalho de um nó.
Vários métodos têm o parâmetro:
excludeSystemWorkflows
Esse parâmetro pode ser definido como true
para indicar que os fluxos de trabalho do sistema devem ser excluídos dos resultados relevantes.
Você pode atualizar a configuração OSGi PayloadMapCache do fluxo de trabalho do Adobe Granite que especifica o fluxo de trabalho Models
a ser considerado como fluxos de trabalho do sistema. Os modelos de fluxo de trabalho padrão (tempo de execução) são:
/var/workflow/models/scheduled_activation/jcr:content/model
/var/workflow/models/scheduled_deactivation/jcr:content/model
Avançar automaticamente a etapa do participante após um tempo limite
Se você precisar avançar automaticamente uma etapa Participante que não foi concluída em um tempo predefinido, você pode:
-
Implemente um ouvinte de eventos OSGI para acompanhar a criação e a modificação da tarefa.
-
Especifique um tempo limite (prazo) e, em seguida, crie um trabalho do sling agendado para ser acionado nesse momento.
-
Grave um manipulador de trabalho que seja notificado quando o tempo limite expirar e acionar o trabalho.
Este manipulador executará a ação necessária na tarefa se ela ainda não tiver sido concluída
Interagir com instâncias de fluxo de trabalho
Veja a seguir exemplos básicos de como interagir (de forma programática) com instâncias de fluxo de trabalho.
Interagir com instâncias de fluxo de trabalho - 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);
Interação com instâncias de fluxo de trabalho - 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);
Interagir com instâncias de fluxo de trabalho - REST usando curl
-
Iniciando um fluxo de trabalho
# 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
-
Listando as instâncias
# listing the instances curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Isso listará todas as instâncias; por exemplo:
[ {"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"} ,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"} ]
NOTE
Consulte Como obter uma Lista de todos os Fluxos de Trabalho em Execução com suas IDs para listar instâncias com um status específico. -
Suspendendo um fluxo de trabalho
# 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
-
Retomando um fluxo de trabalho
# 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
-
Encerrando uma instância de fluxo de trabalho
# 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
Interagir com itens de trabalho
Veja a seguir exemplos básicos de como interagir (programaticamente) com itens de trabalho.
Interagir com itens de trabalho - 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));
Interagir com Itens de Trabalho - 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));
Interagir com itens de trabalho - REST usando curl
-
Listando Itens de Trabalho da Caixa de Entrada
# listing the work items curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Os detalhes dos itens de trabalho que estão atualmente na Caixa de entrada serão listados; por exemplo:
[{ "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" }
-
Delegando itens de trabalho
# 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
Odelegatee
deve ser uma opção válida para a etapa do fluxo de trabalho. -
Concluindo ou avançando itens de trabalho para a próxima etapa
# 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
Acompanhamento de eventos de fluxo de trabalho
Use a estrutura de eventos OSGi para acompanhar eventos definidos pela classe com.adobe.granite.workflow.event.WorkflowEvent
. Esta classe também fornece vários métodos úteis para obter informações sobre o assunto do evento. Por exemplo, o método getWorkItem
retorna o objeto WorkItem
para o item de trabalho envolvido no evento.
O código de exemplo a seguir define um serviço que escuta eventos de fluxo de trabalho e executa tarefas de acordo com o tipo de 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;
}
}