Problema
Você pesquisa um exemplo de como capturar e processar eventos de fluxo de trabalho.
Resolução
Uma classe para capturar e manipular eventos de fluxo de trabalho deve implementar as interfaces EventHandler e JobProcessor.
Esta Classe deve ser um Serviço OSGI e implantar o método process(Event event)
. Nesse método, o objeto fornecido event
(Event) poderá ser usado para acessar todos os dados relacionados ao evento.
Assim que este Serviço estiver disponível no sistema (por exemplo, quando você incluí-lo em um pacote e instalá-lo), os eventos de worklow serão capturados e tratados com esta Classe ...
Exemplo
Observação: o exemplo a seguir é muito simples e não deverá ser usado na produção dessa forma.
Você precisará incluir a Classe de exemplo em um de seus pacotes e marcar o pacote com.day.cq.examples.wf
externo para disponibilizar o serviço no sistema ...
package com.day.cq.examples.wf; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.day.cq.workflow.WorkflowService; import com.day.cq.workflow.WorkflowSession; import com.day.cq.workflow.WorkflowException; import com.day.cq.workflow.exec.Workflow; import com.day.cq.workflow.exec.WorkflowData; import com.day.cq.workflow.event.WorkflowEvent; import org.osgi.service.event.Event; import org.osgi.service.event.EventHandler; import org.apache.sling.event.EventUtil; import org.apache.sling.event.JobProcessor; import org.apache.sling.jcr.api.SlingRepository; /** * <code>WorkFlowTest</code>... * * @scr.component metatype="false" * @scr.service interface="org.osgi.service.event.EventHandler" * @scr.property name="event.topics" refValues.a="com.day.cq.workflow.event.WorkflowEvent.EVENT_TOPIC" */ public class WorkflowEventCatcher implements EventHandler, JobProcessor { protected final Logger log = LoggerFactory.getLogger(WorkflowEventCatcher.class); /** * @scr.reference policy="static" */ private WorkflowService workflowService; /** * @scr.reference policy="static" */ protected SlingRepository repository; public void handleEvent(Event event) { EventUtil.processJob(event, this); } /** * @return boolean * @see org.apache.sling.event.JobProcessor#process(org.osgi.service.event.Event) */ public boolean process(Event event) { log.info("Received event of topic: " + event.getTopic()); if (EventUtil.isLocal(event)) { WorkflowSession wfSession = null; try { wfSession = getWorkflowSession(); String topic = event.getTopic(); if (topic.equals(WorkflowEvent.EVENT_TOPIC)) { Object eventType = event.getProperty(WorkflowEvent.EVENT_TYPE); if (eventType.equals(WorkflowEvent.WORKFLOW_STARTED_EVENT)) { log.info("Workflow has started"); String instanceId = (String) event.getProperty(WorkflowEvent.WORKFLOW_INSTANCE_ID); try { Workflow instance = wfSession.getWorkflow(instanceId); WorkflowData data = instance.getWorkflowData(); // additional code comes here // ... } catch (WorkflowException we) { log.warn("Unable to load workflow instance", we); } } else if (eventType.equals(WorkflowEvent.WORKFLOW_COMPLETED_EVENT)) { log.info("Workflow has ended"); } else if (eventType.equals(WorkflowEvent.NODE_TRANSITION_EVENT)) { log.info("Workflow in transition"); } } } catch (Exception e) { log.error(e.getMessage()); } finally { if (wfSession != null) { wfSession.getSession().logout(); } } } return true; } /** * helper to get WorkflowSession * * @return WorkflowSession */ private WorkflowSession getWorkflowSession() { try { Session adminSession = repository.loginAdministrative(null); return workflowService.getWorkflowSession(adminSession); } catch (RepositoryException re) { log.error(re.getMessage()); } return null; } }
Aplica-se a
CQ5.2+