Problème
Vous cherchez un exemple d’utilisation et de traitement des événements de processus.
Résolution
Une classe pour capturer et traiter les événements de processus doit mettre en œuvre les interfaces EventHandler et JobProcessor.
Cette classe doit être un service OSGi et mettre en oeuvre la méthode process(Event event)
. Dans cette méthode, l’objet fourni événement
(Event) peut être utilisé pour accéder à toutes les données associées aux événements.
Dès que ce service est disponible dans le système (par exemple, lorsque vous l’incluez dans un lot et vous l’installez), les événements de processus sont capturés et traités avec cette classe.
Exemple
Remarque : l’exemple suivant est très simple et il est n’est pas à utiliser en production tel qu’il est.
Vous devez inclure la classe d'instance dans l'un des lots et marquer le module externe com.day.cq.examples.wf
pour rendre le service disponible dans le système.
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; } }
S’applique à
CQ5.2+
Accéder à votre compte