/** * Schedules EmailBody for processing. * * @param EmailBody $emailBody */ protected function scheduleProcess(EmailBody $emailBody) { /* * Retrieve all process definitions to trigger */ $definitions = $this->processStorage->getService()->getProcessDefinitionNames(); $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]); /* * Trigger process definitions with provided data */ foreach ($definitions as $definition) { $trigger = new ProcessTrigger(); $trigger->setDefinition($definition); $data = new ProcessData(); $data->set('data', $emailBody); $this->handler->handleTrigger($trigger, $data); } }
/** * Schedules EmailBody for processing. * * @param EmailBody $emailBody */ protected function scheduleProcess(EmailBody $emailBody) { /* * Retrieve all process definitions to trigger */ $definitions = $this->processStorage->getService()->getProcessDefinitionNames(); $definitions = $this->getDefinitionRepository()->findBy(['name' => $definitions]); /* * Trigger process definitions with provided data */ foreach ($definitions as $definition) { $trigger = new ProcessTrigger(); //id must be unique otherwise in cache will be saved and runned first definition with id = null $trigger->setId($definition->getName()); $trigger->setDefinition($definition); $data = new ProcessData(); $data->set('data', $emailBody); $this->handler->handleTrigger($trigger, $data); } }
/** * @param PostFlushEventArgs $args */ public function postFlush(PostFlushEventArgs $args) { if (!$this->enabled) { return; } $entityManager = $args->getEntityManager(); // handle processes $hasQueuedOrHandledProcesses = false; $handledProcesses = []; foreach ($this->scheduledProcesses as &$entityProcesses) { while ($entityProcess = array_shift($entityProcesses)) { /** @var ProcessTrigger $trigger */ $trigger = $entityProcess['trigger']; /** @var ProcessData $data */ $data = $entityProcess['data']; if (!$this->handler->isTriggerApplicable($trigger, $data)) { $this->logger->debug('Process trigger is not applicable', $trigger, $data); continue; } if ($trigger->isQueued() || $this->forceQueued) { $processJob = $this->queueProcess($trigger, $data); $entityManager->persist($processJob); $this->queuedJobs[(int) $trigger->getTimeShift()][$trigger->getPriority()][] = $processJob; } else { $this->logger->debug('Process handled', $trigger, $data); $this->handler->handleTrigger($trigger, $data); $handledProcesses[] = $entityProcess; } $hasQueuedOrHandledProcesses = true; } } // save both handled entities and queued process jobs if ($hasQueuedOrHandledProcesses) { $entityManager->flush(); foreach ($handledProcesses as $entityProcess) { /** @var ProcessTrigger $trigger */ $trigger = $entityProcess['trigger']; /** @var ProcessData $data */ $data = $entityProcess['data']; $this->handler->finishTrigger($trigger, $data); } } // delete unused processes if ($this->removedEntityHashes) { $this->registry->getRepository('OroWorkflowBundle:ProcessJob')->deleteByHashes($this->removedEntityHashes); $this->removedEntityHashes = array(); } // create queued JMS jobs $this->createJobs($entityManager); }
public function testFinishJob() { $processTrigger = $this->getMock('Oro\\Bundle\\WorkflowBundle\\Entity\\ProcessTrigger'); $processData = $this->getMockBuilder('Oro\\Bundle\\WorkflowBundle\\Model\\ProcessData')->disableOriginalConstructor()->getMock(); $processJob = $this->getMock('Oro\\Bundle\\WorkflowBundle\\Entity\\ProcessJob'); $processJob->expects($this->once())->method('getProcessTrigger')->will($this->returnValue($processTrigger)); $processJob->expects($this->once())->method('getData')->will($this->returnValue($processData)); $this->eventDispatcher->expects($this->once())->method('dispatch')->with(ProcessEvents::HANDLE_AFTER_FLUSH, $this->callback(function ($event) use($processTrigger, $processData) { $this->assertInstanceOf('Oro\\Bundle\\WorkflowBundle\\Event\\ProcessHandleEvent', $event); $this->assertAttributeSame($processTrigger, 'processTrigger', $event); $this->assertAttributeSame($processData, 'processData', $event); return true; })); $this->handler->finishJob($processJob); }