1 | <?php |
||
16 | class JobManager extends BaseJobManager |
||
17 | { |
||
18 | use CommonTrait; |
||
19 | protected $formerIdGenerators; |
||
20 | protected static $saveInsertCalled = null; |
||
21 | protected static $resetInsertCalled = null; |
||
22 | |||
23 | 9 | public function stopIdGenerator($objectName) |
|
24 | { |
||
25 | 9 | $objectManager = $this->getObjectManager(); |
|
26 | 9 | $repository = $objectManager->getRepository($objectName); |
|
27 | /** @var ClassMetadata $metadata */ |
||
28 | 9 | $metadata = $objectManager->getClassMetadata($repository->getClassName()); |
|
29 | 9 | $this->formerIdGenerators[$objectName]['generator'] = $metadata->idGenerator; |
|
30 | 9 | $this->formerIdGenerators[$objectName]['type'] = $metadata->generatorType; |
|
31 | 9 | $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); |
|
32 | 9 | $metadata->setIdGenerator(new AssignedGenerator()); |
|
33 | 9 | } |
|
34 | |||
35 | 1 | public function restoreIdGenerator($objectName) |
|
36 | { |
||
37 | 1 | $objectManager = $this->getObjectManager(); |
|
38 | 1 | $repository = $objectManager->getRepository($objectName); |
|
39 | /** @var ClassMetadata $metadata */ |
||
40 | 1 | $metadata = $objectManager->getClassMetadata($repository->getClassName()); |
|
41 | 1 | $generator = $this->formerIdGenerators[$objectName]['generator']; |
|
42 | 1 | $type = $this->formerIdGenerators[$objectName]['type']; |
|
43 | 1 | $metadata->setIdGeneratorType($type); |
|
44 | 1 | $metadata->setIdGenerator($generator); |
|
45 | 1 | } |
|
46 | |||
47 | 3 | public function countJobsByStatus($objectName, $status, $workerName = null, $method = null) |
|
48 | { |
||
49 | /** @var EntityManager $objectManager */ |
||
50 | 3 | $objectManager = $this->getObjectManager(); |
|
51 | |||
52 | $qb = $objectManager |
||
53 | 3 | ->createQueryBuilder() |
|
54 | 3 | ->select('count(a.id)') |
|
55 | 3 | ->from($objectName, 'a') |
|
56 | 3 | ->where('a.status = :status'); |
|
57 | |||
58 | 3 | if (null !== $workerName) { |
|
59 | 1 | $qb->andWhere('a.workerName = :workerName') |
|
60 | 1 | ->setParameter(':workerName', $workerName); |
|
61 | } |
||
62 | |||
63 | 3 | if (null !== $method) { |
|
64 | 1 | $qb->andWhere('a.method = :method') |
|
65 | 1 | ->setParameter(':method', $workerName); |
|
66 | } |
||
67 | |||
68 | 3 | $count = $qb->setParameter(':status', $status) |
|
69 | 3 | ->getQuery()->getSingleScalarResult(); |
|
70 | |||
71 | 3 | if (!$count) { |
|
72 | 1 | return 0; |
|
73 | } |
||
74 | |||
75 | 3 | return $count; |
|
76 | } |
||
77 | |||
78 | /** |
||
79 | * @param string|null $workerName |
||
80 | * @param string|null $method |
||
81 | * |
||
82 | * @return int Count of jobs pruned |
||
83 | */ |
||
84 | 1 | public function pruneErroneousJobs($workerName = null, $method = null) |
|
85 | { |
||
86 | /** @var EntityManager $objectManager */ |
||
87 | 1 | $objectManager = $this->getObjectManager(); |
|
88 | 1 | $qb = $objectManager->createQueryBuilder()->delete($this->getArchiveObjectName(), 'j'); |
|
89 | 1 | $qb->where('j.status = :status') |
|
90 | 1 | ->setParameter(':status', BaseJob::STATUS_ERROR); |
|
91 | |||
92 | 1 | $this->addWorkerNameCriterion($qb, $workerName, $method); |
|
93 | 1 | $query = $qb->getQuery(); |
|
94 | |||
95 | 1 | return intval($query->execute()); |
|
96 | } |
||
97 | |||
98 | 13 | protected function resetSaveOk($function) |
|
99 | { |
||
100 | 13 | $objectManager = $this->getObjectManager(); |
|
101 | 13 | $splObjectHash = spl_object_hash($objectManager); |
|
102 | |||
103 | 13 | if ('save' === $function) { |
|
104 | $compare = static::$resetInsertCalled; |
||
105 | } else { |
||
106 | 13 | $compare = static::$saveInsertCalled; |
|
107 | } |
||
108 | |||
109 | 13 | if ($splObjectHash === $compare) { |
|
110 | // Insert SQL is cached... |
||
111 | $msg = "Can't call save and reset within the same process cycle (or using the same EntityManager)"; |
||
112 | throw new \Exception($msg); |
||
113 | } |
||
114 | |||
115 | 13 | if ('save' === $function) { |
|
116 | static::$saveInsertCalled = spl_object_hash($objectManager); |
||
117 | } else { |
||
118 | 13 | static::$resetInsertCalled = spl_object_hash($objectManager); |
|
119 | } |
||
120 | 13 | } |
|
121 | |||
122 | /** |
||
123 | * @param string $workerName |
||
124 | * @param string $method |
||
125 | */ |
||
126 | 8 | protected function addWorkerNameCriterion(QueryBuilder $queryBuilder, $workerName = null, $method = null) |
|
127 | { |
||
128 | 8 | if (null !== $workerName) { |
|
129 | 3 | $queryBuilder->andWhere('j.workerName = :workerName')->setParameter(':workerName', $workerName); |
|
130 | } |
||
131 | |||
132 | 8 | if (null !== $method) { |
|
133 | 2 | $queryBuilder->andWhere('j.method = :method')->setParameter(':method', $method); |
|
134 | } |
||
135 | 8 | } |
|
136 | |||
137 | 1 | protected function updateExpired($workerName = null, $method = null) |
|
138 | { |
||
139 | /** @var EntityManager $objectManager */ |
||
140 | 1 | $objectManager = $this->getObjectManager(); |
|
141 | 1 | $qb = $objectManager->createQueryBuilder()->update($this->getObjectName(), 'j'); |
|
142 | 1 | $qb->set('j.status', ':newStatus'); |
|
143 | 1 | $qb->where('j.expiresAt <= :expiresAt') |
|
144 | 1 | ->setParameter(':expiresAt', new \DateTime()); |
|
145 | 1 | $qb->andWhere('j.status = :status') |
|
146 | 1 | ->setParameter(':status', BaseJob::STATUS_NEW) |
|
147 | 1 | ->setParameter(':newStatus', Job::STATUS_EXPIRED); |
|
148 | |||
149 | 1 | $this->addWorkerNameCriterion($qb, $workerName, $method); |
|
150 | 1 | $query = $qb->getQuery(); |
|
151 | |||
152 | 1 | return intval($query->execute()); |
|
153 | } |
||
154 | |||
155 | /** |
||
156 | * Removes archived jobs older than $olderThan. |
||
157 | * |
||
158 | * @param \DateTime $olderThan |
||
159 | */ |
||
160 | 1 | public function pruneArchivedJobs(\DateTime $olderThan) |
|
161 | { |
||
162 | /** @var EntityManager $entityManager */ |
||
163 | 1 | $entityManager = $this->getObjectManager(); |
|
164 | |||
165 | 1 | return $this->removeOlderThan($entityManager, |
|
166 | 1 | $this->getArchiveObjectName(), |
|
167 | 1 | 'updatedAt', |
|
168 | 1 | $olderThan); |
|
169 | } |
||
170 | |||
171 | 2 | public function getJobCount($workerName = null, $method = null) |
|
216 | |||
217 | /** |
||
218 | * Get Jobs statuses. |
||
219 | */ |
||
220 | 2 | public function getStatus() |
|
221 | { |
||
222 | 2 | $result = []; |
|
223 | 2 | $this->getStatusByEntityName($this->getObjectName(), $result); |
|
240 | |||
241 | /** |
||
242 | * @param string $entityName |
||
243 | */ |
||
244 | 2 | protected function getStatusByEntityName($entityName, array &$result) |
|
245 | { |
||
246 | /** @var EntityManager $objectManager */ |
||
247 | 2 | $objectManager = $this->getObjectManager(); |
|
248 | 2 | $result1 = $objectManager->getRepository($entityName)->createQueryBuilder('j')->select('j.workerName, j.method, j.status, count(j) as c') |
|
249 | 2 | ->groupBy('j.workerName, j.method, j.status')->getQuery()->getArrayResult(); |
|
250 | |||
251 | 2 | foreach ($result1 as $item) { |
|
252 | 1 | $method = $item['workerName'].'->'.$item['method'].'()'; |
|
253 | 1 | if (!isset($result[$method])) { |
|
254 | 1 | $result[$method] = [BaseJob::STATUS_NEW => 0, |
|
255 | 1 | BaseJob::STATUS_RUNNING => 0, |
|
256 | 1 | RetryableJob::STATUS_EXPIRED => 0, |
|
257 | 1 | RetryableJob::STATUS_MAX_ERROR => 0, |
|
258 | 1 | RetryableJob::STATUS_MAX_STALLED => 0, |
|
259 | 1 | RetryableJob::STATUS_MAX_RETRIES => 0, |
|
260 | 1 | BaseJob::STATUS_SUCCESS => 0, |
|
261 | 1 | BaseJob::STATUS_ERROR => 0, ]; |
|
262 | } |
||
263 | 1 | $result[$method][$item['status']] += intval($item['c']); |
|
264 | } |
||
265 | 2 | } |
|
266 | |||
267 | /** |
||
268 | * Get the next job to run (can be filtered by workername and method name). |
||
269 | * |
||
270 | * @param string $workerName |
||
271 | * @param string $methodName |
||
272 | * @param bool $prioritize |
||
273 | * |
||
274 | * @return Job|null |
||
275 | */ |
||
276 | 6 | public function getJob($workerName = null, $methodName = null, $prioritize = true, $runId = null) |
|
339 | } |
||
340 |
It seems like the type of the argument is not accepted by the function/method which you are calling.
In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.
We suggest to add an explicit type cast like in the following example: