Completed
Push — master ( 0726a8...336a87 )
by Emil
02:19
created

QueueScheduler::queue()   B

Complexity

Conditions 5
Paths 12

Size

Total Lines 29
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 8.439
c 0
b 0
f 0
cc 5
eloc 18
nc 12
nop 1
1
<?php
2
3
namespace Glooby\TaskBundle\Queue;
4
5
use Doctrine\Common\Persistence\ManagerRegistry;
6
use Doctrine\ORM\NoResultException;
7
use Glooby\TaskBundle\Entity\QueuedTask;
8
use Glooby\TaskBundle\Entity\QueuedTaskRepository;
9
use Glooby\TaskBundle\Manager\TaskManager;
10
use Glooby\TaskBundle\Model\ScheduleInterface;
11
12
/**
13
 * @author Emil Kilhage
14
 */
15
class QueueScheduler
16
{
17
    /**
18
     * @var ManagerRegistry
19
     */
20
    protected $doctrine;
21
22
    /**
23
     * @param ManagerRegistry $doctrine
24
     */
25
    public function setDoctrine($doctrine)
26
    {
27
        $this->doctrine = $doctrine;
28
    }
29
30
    /**
31
     * @var TaskManager
32
     */
33
    private $taskManager;
34
35
    /**
36
     * @param TaskManager $taskManager
37
     */
38
    public function setTaskManager(TaskManager $taskManager)
39
    {
40
        $this->taskManager = $taskManager;
41
    }
42
43
    /**
44
     *
45
     */
46
    public function schedule()
47
    {
48
        $repo = $this->doctrine->getManager()
49
            ->getRepository('GloobyTaskBundle:Schedule');
50
51
        foreach ($repo->findActive() as $schedule) {
52
            $this->queue($schedule);
53
        }
54
55
        $this->doctrine->getManager()->flush();
56
    }
57
58
    /**
59
     * @param ScheduleInterface $schedule
60
     */
61
    private function queue(ScheduleInterface $schedule)
62
    {
63
        /** @var QueuedTaskRepository $queueRepo */
64
        $queueRepo = $this->doctrine->getManager()
65
            ->getRepository('GloobyTaskBundle:QueuedTask');
66
67
        $expression = $schedule->parseExpression();
68
        $nextExecuteAt = $expression->getNextRunDate();
69
        $prevExecuteAt = $expression->getPreviousRunDate();
70
        $executeAt = null;
71
72
        try {
73
            $queueRepo->getByNameAndExecuteAtBeforeNow($schedule->getName());
74
        } catch (NoResultException $e) {
75
            $executeAt = $prevExecuteAt;
76
        }
77
78
        if (null === $executeAt) {
79
            try {
80
                $queueRepo->getByNameAndExecuteAt($schedule->getName(), $nextExecuteAt);
81
            } catch (NoResultException $e) {
82
                $executeAt = $nextExecuteAt;
83
            }
84
        }
85
86
        if (null !== $executeAt) {
87
            $this->taskManager->queue($schedule->getName(), $executeAt, $schedule->getParams());
88
        }
89
    }
90
}
91