Completed
Push — master ( 55a9c0...ed128c )
by Emil
14:56
created

QueueScheduler::schedule()   B

Complexity

Conditions 6
Paths 13

Size

Total Lines 35
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

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