Problema
Busque un ejemplo de cómo capturar y procesar eventos de flujo de trabajo.
Resolución
Una clase para capturar y gestionar eventos de flujo de trabajo debe implementar las interfaces EventHandler y JobProcessor.
Esta clase debe ser un servicio de OSGI e implementar el método process(Event event)
. En este método, el objeto evento
proporcionado (Evento) puede utilizarse para acceder a todos los datos relacionados con el evento.
Tan pronto como este servicio esté disponible en el sistema (por ejemplo, al incluirlo en un paquete e instalarlo) los eventos de flujo de trabajo serán capturados y manejados con esta Clase.
Ejemplo
Nota: el siguiente ejemplo es muy simple y no debe ser usado en la producción tal como está.
Debe incluir el ejemplo Clase en uno de sus paquetes y marcar el paquete com.day.cq.cq.examples.wf
como externo para que el servicio esté disponible en el 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; } }
Se aplica a
CQ5.2+