Problem
Sie suchen nach einem Beispiel, wie Arbeitsablauf-Events erfasst und verarbeitet werden?
Lösung
Eine Klasse, um Arbeitsablauf-Events zu erfassen und zu verarbeiten muss die Schnittstellen EventHandler und JobProcessor implementieren.
Diese Klasse muss ein OSGi-Dienst sein und die Methode Verarbeitung (Event event)
implementieren. In dieser Methode kann das angegebene Objekt event
(Event) verwendet werden, um auf alle mit dem Event verbunden Daten zuzugreifen.
Sobald dieser Dienst im System verfügbar ist (zum Beispiel, wenn Sie ihn in ein Bundle aufnehmen und dieses installieren), werden die Workflow-Ergebnisse eingefangen und mit dieser Klasse verarbeitet...
Beispiel
Hinweis: Das folgende Beispiel ist sehr einfach und in dieser Form nicht in der Produktion zu verwenden.
Sie müssen die Beispielklasse in eines Ihrer Pakete aufnehmen und das Paket com.day.cq.examples.wf
extern markieren, damit der Dienst im System verfügbar ist...
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; } }
Gilt für
CQ5.2+
Bei Ihrem Konto anmelden