Quando personalizar e estender seus workflows você pode acessar objetos de fluxo de trabalho:
A API Java de fluxo de trabalho consiste no pacote com.adobe.granite.workflow
e em vários subpacotes. O membro mais significativo da API é a classe com.adobe.granite.workflow.WorkflowSession
. A classe WorkflowSession
fornece acesso aos objetos de fluxo de trabalho em tempo de design e em tempo de execução:
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-chave Java a serem usados ao interagir programaticamente com workflows. Os exemplos a seguir demonstram como obter e usar os objetos de classe no código.
Recursos | Objetos |
---|---|
Acessar um fluxo de trabalho | WorkflowSession |
Execução e consulta de uma instância de fluxo de trabalho | Workflow WorkItem WorkflowData |
Gerenciamento de um modelo de fluxo de trabalho | WorkflowModel WorkflowNode WorkflowTransition |
Informações para um nó que está no fluxo de trabalho (ou não) | WorkflowStatus |
Conforme descrito em Localizando o Script, 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 obter o objeto WorkflowSession
; por exemplo:
var wfsession = sling.getRequest().getResource().getResourceResolver().adaptTo(Packages.com.adobe.granite.workflow.WorkflowSession);
O console Fluxo de trabalho utiliza fortemente a REST API; portanto, esta página descreve a REST API para workflows.
A ferramenta de linha de comando de ondulação permite usar a API REST do fluxo de trabalho para acessar objetos do fluxo de trabalho e gerenciar ciclos de vida da instância. Os exemplos nesta página demonstram o uso da REST API por meio da ferramenta de linha de comando de ondulação.
As seguintes ações são compatíveis com a REST API:
Ao usar o Firebug, uma extensão Firefox para desenvolvimento da Web, é possível seguir o tráfego HTTP quando o console é operado. Por exemplo, você pode verificar os parâmetros e os valores enviados para o servidor AEM com uma solicitação POST
.
Nesta página, presume-se que AEM é executado em localhost na porta 4502
e que o contexto de instalação é " /
" (raiz). Se não for o caso da sua instalação, os URIs aos quais as solicitações HTTP se aplicam precisam ser adaptados de acordo.
A renderização suportada para solicitações GET
é a renderização JSON. Os URLs para GET
devem ter a extensão .json
, por exemplo:
http://localhost:4502/etc/workflow.json
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances
Método de solicitação HTTP | Ações |
GET |
Lista as instâncias de fluxo de trabalho disponíveis. |
POST |
Cria uma nova instância do fluxo de trabalho. Os parâmetros são: |
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances.{state}
Método de solicitação HTTP | Ações |
---|---|
GET |
Lista as instâncias de fluxo de trabalho disponíveis e seus estados ( RUNNING , SUSPENDED , ABORTED ou COMPLETED ) |
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/instances/{id}
Método de solicitação HTTP | Ações |
GET |
Obtém os dados de instâncias (definição e metadados) incluindo o link para o respectivo modelo de fluxo de trabalho. |
POST |
Altera o estado da instância. O novo estado é enviado como o parâmetro state e deve ter um dos seguintes valores: RUNNING , SUSPENDED ou ABORTED .Se o novo estado não puder ser alcançado (por exemplo, ao suspender uma instância encerrada), uma resposta 409 (CONFLICT ) será enviada de volta ao cliente. |
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/models
Método de solicitação HTTP | Ações |
GET |
Lista os modelos de fluxo de trabalho disponíveis. |
POST |
Cria um novo modelo de fluxo de trabalho. Se o parâmetro 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 201 resposta (CREATED ) é enviada de volta com um cabeçalho de localização contendo o 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 .Nos casos dos model e modelfile parâmetros, 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 é entregue com o motor de workflow. 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 ao 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"}
]
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502*{uri}*
Onde *{uri}*
é o caminho para o nó modelo no repositório.
Método de solicitação HTTP | Ações |
GET |
Obtém a versão HEAD do modelo (definição e metadados). |
PUT |
Atualiza a versão 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 |
Comportamento igual ao do PUT. Necessário porque AEM widgets não suportam operações PUT . |
DELETE |
Exclui o modelo. Para resolver problemas de firewall/proxy, uma POST que contém uma entrada de cabeçalho X-HTTP-Method-Override com valor DELETE também será aceita como solicitação DELETE . |
Exemplo: no navegador, uma solicitação para http://localhost:4502/var/workflow/models/publish_example.json
retorna uma resposta json
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":
{
}
}
]}
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/etc/workflow/models/{id}.{version}
Método de solicitação HTTP | Ações |
---|---|
GET |
Obtém os dados do modelo na versão especificada (se houver). |
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/bin/workflow/inbox
Método de solicitação HTTP | Ações |
GET |
Lista os itens de trabalho que estão na caixa de entrada do usuário, que é identificado pelos cabeçalhos de autenticação HTTP. |
POST |
Completa o item de trabalho cujo URI é enviado como parâmetro item e avança a instância de fluxo de trabalho de acordo com o(s) nó(s) seguinte(s), que é definido pelo parâmetro route ou backroute no caso de voltar uma etapa.Se o parâmetro delegatee for enviado, o item de trabalho identificado pelo parâmetro item será delegado ao participante especificado. |
Os seguintes métodos de solicitação HTTP se aplicam a:
http://localhost:4502/bin/workflow/inbox/{id}
Método de solicitação HTTP | Ações |
---|---|
GET |
Obtém os dados (definição e metadados) da caixa de entrada WorkItem identificada por sua ID. |
Para obter uma lista de todos os workflows em execução, execute um GET para:
http://localhost:4502/etc/workflow/instances.RUNNING.json
Exemplo usando curva:
curl -u admin:admin http://localhost:4502/etc/workflow/instances.RUNNING.json
O uri
exibido nos resultados pode ser usado como a instância id
em outros comandos; por exemplo:
[
{"uri":"/etc/workflow/instances/server0/2017-03-08/request_for_activation_1"}
]
Esse comando curl
pode ser usado com qualquer status do fluxo de trabalho no lugar de RUNNING
.
Para alterar o Título do fluxo de trabalho exibido na guia Instâncias do console do fluxo de trabalho, envie um comando POST
:
para: http://localhost:4502/etc/workflow/instances/{id}
com os seguintes parâmetros:
action
: o seu valor tem de ser: UPDATE
workflowTitle
: o título do fluxo de trabalhoExemplo usando curva:
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
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
Exemplo usando curva:
curl -u admin:admin http://localhost:4502/etc/workflow/models.json
Consulte também Gerenciando Modelos de Fluxo de Trabalho.
A classe com.adobe.granite.workflow.WorkflowSession
é adaptável a partir de um objeto javax.jcr.Session
ou de um objeto org.apache.sling.api.resource.ResourceResolver
.
Em um script JSP (ou código Java para uma classe 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);
%>
Use a variável sling
para obter o objeto SlingHttpServletRequest
que você usa 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);
Os exemplos a seguir mostram como acessar modelos de fluxo de trabalho:
WorkflowSession.createNewModel
.Os exemplos usados:
/var/workflow/models/mymodel/jcr:content/model
).A exclusão do modelo define a propriedade deleted
do nó filho do modelo metaData
como true
.
A exclusão não remove o nó modelo.
Ao criar um novo 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 tipo cq:Page
tendo 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 esse nó cq:Page
e usar seu nó jcr:content
como o pai do nó 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
<%@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);
%>
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);
# deleting the model by its id
curl -u admin:admin -X DELETE http://localhost:4502/etc/workflow/models/{id}
Devido ao nível de detalhes necessário, o ondulado não é considerado prático para criar e/ou ler um modelo.
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 workflows do sistema devem ser excluídos dos resultados relevantes.
Você pode atualizar a configuração do OSGi Adobe Granite Workflow PayloadMapCache que especifica o fluxo de trabalho Models
a ser considerado como workflows 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
Se precisar avançar automaticamente uma etapa Participante que não tenha sido concluída em um tempo predefinido, você pode:
Implemente um ouvinte de evento OSGI para acompanhar a criação e modificação de tarefas.
Especifique um tempo limite (prazo) e crie um trabalho de sling agendado para ser acionado nesse momento.
Grave um manipulador de trabalho que seja notificado quando o tempo limite expirar e acionar o trabalho.
Esse manipulador executará a ação necessária na tarefa se a tarefa ainda não estiver concluída
As medidas a tomar devem ser claramente definidas para poderem utilizar esta abordagem.
Os exemplos a seguir fornecem exemplos básicos de como interagir (programaticamente) com instâncias de fluxo de trabalho.
// 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);
// 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);
Iniciar 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
Listar as instâncias
# listing the instances
curl -u admin:admin http://localhost:4502/etc/workflow/instances.json
Isso lista todos os casos; por exemplo:
[
{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_1"}
,{"uri":"/var/workflow/instances/server0/2018-02-26/prototype-01_2"}
]
Consulte Como obter uma Lista de todos os Workflows em execução com suas IDs para listar instâncias com um status específico.
Suspensão de 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
Os exemplos a seguir fornecem exemplos básicos de como interagir (programaticamente) com itens de trabalho.
// 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));
// 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));
Listando itens de trabalho da caixa de entrada
# listing the work items
curl -u admin:admin http://localhost:4502/bin/workflow/inbox
Serão listados os detalhes dos itens de trabalho que estão atualmente na Caixa de entrada; 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
delegatee
deve ser uma opção válida para a etapa do fluxo de trabalho.
Concluir ou avançar 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
Use a estrutura do evento OSGi para acompanhar eventos que a classe com.adobe.granite.workflow.event.WorkflowEvent
define. Essa 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 que está 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;
}
}