Problema

Si cerca un esempio di cattura ed elaborazione degli eventi del workflow.

Risoluzione

Una classe per catturare e gestire gli eventi del workflow deve implementare le interfacce EventHandler e JobProcessor.

Questa classe deve essere un servizio OSGI e implementare il metodo process(Event event). In questo metodo l'evento oggetto fornito (Event) può essere utilizzato per accedere a tutti i dati relativi all'evento.

Non appena questo servizio è disponibile nel sistema (per esempio quando lo si include in un bundle e lo si installa) gli eventi del workflow saranno catturati e gestiti con questa Classe.....

Esempio

Nota: L'esempio seguente è molto semplice e non può essere utilizzato in produzione così com'è.
Devi includere la classe di esempio in uno dei tuoi bundle e contrassegnare il pacchetto com.day.cq.examples.wf esterno per rendere il servizio disponibile nel 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; } } 

Prodotti interessati:

CQ5.2+

Questo prodotto è concesso in licenza in base alla licenza di Attribuzione-Non commerciale-Condividi allo stesso modo 3.0 Unported di Creative Commons.  I post su Twitter™ e Facebook non sono coperti dai termini di Creative Commons.

Note legali   |   Informativa sulla privacy online