| 1 |  |  | <?php | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | namespace Dtc\QueueBundle\Doctrine; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  | use Doctrine\Common\Persistence\ObjectManager; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  | use Doctrine\Common\Persistence\ObjectRepository; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  | use Dtc\QueueBundle\Model\Job; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  | use Dtc\QueueBundle\Model\JobTiming; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  | use Dtc\QueueBundle\Model\Run; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  | use Dtc\QueueBundle\Model\RunManager; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  | abstract class BaseRunManager extends RunManager | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  | { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |     /** @var ObjectManager */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |     protected $objectManager; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |     /** @var string|null */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  |     protected $runArchiveClass; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 | 10 |  |     public function __construct(ObjectManager $objectManager, $runClass, $jobTimingClass, $recordTimings) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 | 10 |  |         $this->objectManager = $objectManager; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 | 10 |  |         parent::__construct($runClass, $jobTimingClass, $recordTimings); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 | 10 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |      * @return ObjectManager | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 | 9 |  |     public function getObjectManager() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 | 9 |  |         return $this->objectManager; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |      * @return ObjectRepository | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |     public function getRepository() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |         return $this->objectManager->getRepository($this->getRunClass()); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |      * @return null|string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 | 9 |  |     public function getRunArchiveClass() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 | 9 |  |         return $this->runArchiveClass; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |      * @param null|string $runArchiveClass | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 | 10 |  |     public function setRunArchiveClass($runArchiveClass) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 | 10 |  |         $this->runArchiveClass = $runArchiveClass; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 | 10 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 | 2 |  |     public function recordJobRun(Job $job) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 | 2 |  |         parent::recordJobRun($job); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 | 2 |  |         $finishedAt = $job->getFinishedAt(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 | 2 |  |         if (null === $finishedAt) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |             $finishedAt = new \DateTime(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |         /** @var JobTiming $jobTiming */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 | 2 |  |         $jobTiming = new $this->jobTimingClass(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 | 2 |  |         $jobTiming->setFinishedAt($finishedAt); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 | 2 |  |         $this->objectManager->persist($jobTiming); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 | 2 |  |         $this->objectManager->flush(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 | 2 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 | 2 |  |     public function pruneStalledRuns() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 | 2 |  |         $runs = $this->getOldLiveRuns(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         /** @var Run $run */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 | 2 |  |         $delete = []; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 | 2 |  |         foreach ($runs as $run) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 | 2 |  |             $lastHeartbeat = $run->getLastHeartbeatAt(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 | 2 |  |             $time = time() - 3600; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 | 2 |  |             $processTimeout = $run->getProcessTimeout(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 | 2 |  |             $time -= $processTimeout; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 | 2 |  |             $oldDate = new \DateTime("@$time"); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 | 2 |  |             if (null === $lastHeartbeat || $oldDate > $lastHeartbeat) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 | 2 |  |                 $delete[] = $run; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |             } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 | 2 |  |         return $this->deleteOldRuns($delete); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |      * @param array $delete | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |      * @return int | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 | 2 |  |     protected function deleteOldRuns(array $delete) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 | 2 |  |         $count = count($delete); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 | 2 |  |         $objectManager = $this->getObjectManager(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 | 2 |  |         for ($i = 0; $i < $count; $i += 100) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 | 2 |  |             $deleteList = array_slice($delete, $i, 100); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 | 2 |  |             foreach ($deleteList as $object) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 | 2 |  |                 $objectManager->remove($object); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |             } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 | 2 |  |             $this->flush(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 | 2 |  |         return $count; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 | 2 |  |     protected function flush() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 | 2 |  |         $this->getObjectManager()->flush(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 116 | 2 |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 117 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 118 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 119 |  |  |      * @return array | 
            
                                                                                                            
                            
            
                                    
            
            
                | 120 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 121 |  |  |     abstract protected function getOldLiveRuns(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 122 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 123 |  |  |     abstract protected function removeOlderThan($objectName, $field, \DateTime $olderThan); | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 124 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 125 | 1 |  |     public function pruneArchivedRuns(\DateTime $olderThan) | 
            
                                                                        
                            
            
                                    
            
            
                | 126 |  |  |     { | 
            
                                                                        
                            
            
                                    
            
            
                | 127 | 1 |  |         return $this->removeOlderThan($this->getRunArchiveClass(), 'endedAt', $olderThan); | 
            
                                                                        
                            
            
                                    
            
            
                | 128 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 129 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 130 |  |  |     public function pruneJobTimings(\DateTime $olderThan) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 131 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 132 |  |  |         return $this->removeOlderThan($this->getJobTimingClass(), 'createdAt', $olderThan); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 133 |  |  |     } | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 134 |  |  | } | 
            
                                                        
            
                                    
            
            
                | 135 |  |  |  |