Completed
Branch master (294ea0)
by Matthew
18:22
created

BaseJobManagerTest   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 1013
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Importance

Changes 0
Metric Value
wmc 25
lcom 1
cbo 10
dl 0
loc 1013
rs 9.6713
c 0
b 0
f 0

17 Methods

Rating   Name   Duplication   Size   Complexity  
B setUpBeforeClass() 0 32 1
A tearDownAfterClass() 0 7 1
B testOrdering() 0 81 2
B getJobBy() 0 43 1
A testDeleteJob() 0 21 1
A testResetErroneousJobs() 0 54 2
B createErroredJob() 0 31 1
A createStalledJob() 0 55 4
B testResetStalledJobs() 0 102 1
B testPruneErroneousJobs() 0 93 1
B testPruneStalledJobs() 0 155 1
A testBatchJobs() 0 74 3
B testPruneExpiredJobs() 0 120 1
A testPruneArchivedJobs() 0 61 1
A testPerformance() 0 11 2
A getBaseStatus() 0 21 1
A testGetStatus() 0 13 1
1
<?php
2
3
namespace Dtc\QueueBundle\Tests\Doctrine;
4
5
use Doctrine\ODM\MongoDB\DocumentManager;
6
use Doctrine\ORM\EntityManager;
7
use Dtc\QueueBundle\Doctrine\BaseJobManager;
8
use Dtc\QueueBundle\Doctrine\DtcQueueListener;
9
use Dtc\QueueBundle\Model\BaseJob;
10
use Dtc\QueueBundle\Model\Job;
11
use Dtc\QueueBundle\Tests\Model\PriorityTestTrait;
12
use Dtc\QueueBundle\Model\RetryableJob;
13
use Dtc\QueueBundle\Tests\FibonacciWorker;
14
use Dtc\QueueBundle\Tests\Model\BaseJobManagerTest as BaseBaseJobManagerTest;
15
use Dtc\QueueBundle\ODM\JobManager;
16
use Dtc\QueueBundle\Tests\ORM\JobManagerTest;
17
use Symfony\Component\DependencyInjection\Container;
18
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
19
20
/**
21
 * @author David
22
 *
23
 * This test requires local mongodb running
24
 */
25
abstract class BaseJobManagerTest extends BaseBaseJobManagerTest
26
{
27
    use PriorityTestTrait;
28
29
    protected static $dtcQueueListener;
30
31
    /** @var DocumentManager|EntityManager */
32
    protected static $objectManager;
33
    protected static $objectName;
34
    protected static $archiveObjectName;
35
    protected static $runClass;
36
    protected static $runArchiveClass;
37
    protected static $jobTimingClass;
38
    protected static $jobManagerClass;
39
    protected static $runManagerClass;
40
    public static $runManager;
41
42
    public static function setUpBeforeClass()
43
    {
44
        self::$jobManager = new self::$jobManagerClass(self::$objectManager, self::$objectName, self::$archiveObjectName, self::$runClass, self::$runArchiveClass);
45
        self::$jobManager->setMaxPriority(255);
46
        self::$runManager = new self::$runManagerClass(self::$objectManager, self::$runClass, self::$jobTimingClass, true);
47
        self::$runManager->setRunArchiveClass(self::$runArchiveClass);
48
49
        self::assertEquals(255, self::$jobManager->getMaxPriority());
50
        self::assertEquals(JobManager::PRIORITY_DESC, self::$jobManager->getPriorityDirection());
51
        self::$jobManager->setPriorityDirection(JobManager::PRIORITY_ASC);
52
        self::assertEquals(JobManager::PRIORITY_ASC, self::$jobManager->getPriorityDirection());
53
        self::$jobManager->setPriorityDirection(JobManager::PRIORITY_DESC);
54
55
        /** @var BaseJobManager $jobManager */
56
        $jobManager = self::$jobManager;
57
58
        $parameters = new ParameterBag();
59
60
        $container = new Container($parameters);
61
        $container->set('dtc_queue.job_manager', $jobManager);
62
        $container->set('dtc_queue.run_manager', self::$runManager);
63
64
        self::$dtcQueueListener = new DtcQueueListener(self::$jobManager->getArchiveObjectName(), self::$runManager->getRunArchiveClass());
65
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
66
        self::$objectManager->getEventManager()->addEventListener('prePersist', self::$dtcQueueListener);
67
        self::$objectManager->getEventManager()->addEventListener('preRemove', self::$dtcQueueListener);
68
69
        self::$worker = new FibonacciWorker();
70
71
        self::$worker->setJobClass($jobManager->getRepository()->getClassName());
72
        parent::setUpBeforeClass();
73
    }
74
75
    public static function tearDownAfterClass()
76
    {
77
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
78
        self::$objectManager->getEventManager()->removeEventListener('prePersist', self::$dtcQueueListener);
79
        self::$objectManager->getEventManager()->removeEventListener('preRemove', self::$dtcQueueListener);
80
        parent::tearDownAfterClass();
81
    }
82
83
    public function testOrdering()
84
    {
85
        // priority when at
86
        /** @var BaseJobManager $jobManager */
87
        $jobManager = self::$jobManager;
88
89
        $time1 = time() - 2;
90
        $dateTime1 = new \DateTime("@$time1");
91
92
        $time2 = time();
93
        $dateTime2 = new \DateTime("@$time2");
94
95
        /** @var Job $job */
96
        $job = new static::$jobClass(static::$worker, false, null);
97
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
98
        $job->setWhenAt($dateTime1);
99
        $job->setPriority(3);
100
        $id = $job->getId();
101
102
        $job2 = new static::$jobClass(static::$worker, false, null);
103
        $job2->setPriority(1);
104
        $job2->setWhenAt($dateTime2);
105
        $job2->fibonacci(1);
106
        $id2 = $job2->getId();
107
108
        $job3 = new static::$jobClass(static::$worker, false, null);
109
        $job3->setPriority(1);
110
        $job3->setWhenAt($dateTime1);
111
        $job3->fibonacci(1);
112
        $id3 = $job3->getId();
113
114
        $job4 = new static::$jobClass(static::$worker, false, null);
115
        $job4->setPriority(1);
116
        $job4->setWhenAt($dateTime2);
117
        $job4->fibonacci(1);
118
        $id4 = $job4->getId();
119
120
        $nextJob = $jobManager->getJob();
121
        static::assertEquals($id3, $nextJob->getId());
122
        $nextNextJob = $jobManager->getJob();
123
        $nextNextId = $nextNextJob->getId();
124
        static::assertTrue($id4 == $nextNextId || $id2 == $nextNextId, "$nextNextId not equals $id4 or $id2, could be $id or $id3");
125
126
        static::assertNotNull($jobManager->getJob());
127
        static::assertNotNull($jobManager->getJob());
128
129
        // non-priority when at
130
        $time1 = time() - 2;
131
        $dateTime1 = new \DateTime("@$time1");
132
133
        $time2 = time();
134
        $dateTime2 = new \DateTime("@$time2");
135
136
        /** @var Job $job */
137
        $job = new static::$jobClass(static::$worker, false, null);
138
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
139
        $job->setWhenAt($dateTime1);
140
        $job->setPriority(3);
141
        $id = $job->getId();
142
143
        $job2 = new static::$jobClass(static::$worker, false, null);
144
        $job2->setPriority(1);
145
        $job2->setWhenAt($dateTime2);
146
        $job2->fibonacci(1);
147
148
        $job3 = new static::$jobClass(static::$worker, false, null);
149
        $job3->setPriority(1);
150
        $job3->setWhenAt($dateTime2);
151
        $job3->fibonacci(1);
152
153
        $job4 = new static::$jobClass(static::$worker, false, null);
154
        $job4->setPriority(1);
155
        $job4->setWhenAt($dateTime2);
156
        $job4->fibonacci(1);
157
158
        $nextJob = $jobManager->getJob(null, null, false);
159
        static::assertEquals($id, $nextJob->getId());
160
        static::assertNotNull($jobManager->getJob());
161
        static::assertNotNull($jobManager->getJob());
162
        static::assertNotNull($jobManager->getJob());
163
    }
164
165
    public function getJobBy()
166
    {
167
        /** @var BaseJobManager $jobManager */
168
        $jobManager = self::$jobManager;
169
170
        /** @var Job $job */
171
        $job = new static::$jobClass(static::$worker, false, null);
172
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
173
        $id = $job->getId();
174
        $nextJob = $jobManager->getJob('fibonacci', null);
175
        static::assertNotNull($nextJob);
176
        static::assertEquals($id, $nextJob->getId());
177
178
        /** @var Job $job */
179
        $job = new static::$jobClass(static::$worker, false, null);
180
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
181
        $id = $job->getId();
182
        $nextJob = $jobManager->getJob('fibonacci', 'fibonacci');
183
        static::assertNotNull($nextJob);
184
        static::assertEquals($id, $nextJob->getId());
185
186
        /** @var Job $job */
187
        $job = new static::$jobClass(static::$worker, false, null);
188
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
189
        $id = $job->getId();
190
        $nextJob = $jobManager->getJob(null, 'fibonacci');
191
        static::assertNotNull($nextJob);
192
        static::assertEquals($id, $nextJob->getId());
193
194
        /** @var Job $job */
195
        $job = new static::$jobClass(static::$worker, false, null);
196
        $job->fibonacci(1);
0 ignored issues
show
Documentation Bug introduced by
The method fibonacci does not exist on object<Dtc\QueueBundle\Model\Job>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
197
        $id = $job->getId();
198
        $nextJob = $jobManager->getJob(null, 'fibonaccia');
199
        static::assertNull($nextJob);
200
        $nextJob = $jobManager->getJob('fibonacci', 'fibonaccia');
201
        static::assertNull($nextJob);
202
        $nextJob = $jobManager->getJob('fibonaccii', 'fibonacci');
203
        static::assertNull($nextJob);
204
        $nextJob = $jobManager->getJob();
205
        static::assertNotNull($nextJob);
206
        static::assertEquals($id, $nextJob->getId());
207
    }
208
209
    public function testDeleteJob()
210
    {
211
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
212
        $jobManager = self::$jobManager;
213
214
        /** @var Job $job */
215
        $job = $this->getJob();
216
        $id = $job->getId();
217
        $jobManager->deleteJob($job);
218
219
        $nextJob = $jobManager->getJob(null, null, true, 123);
220
        self::assertNull($nextJob, "Shouldn't be any jobs left in queue");
221
222
        $archiveObjectName = $jobManager->getArchiveObjectName();
223
224
        self::assertNotNull($id);
225
        $archiveRepository = $jobManager->getObjectManager()->getRepository($archiveObjectName);
226
        $result = $archiveRepository->find($id);
227
        self::assertNotNull($result);
228
        self::assertEquals($id, $result->getId());
229
    }
230
231
    public function testResetErroneousJobs()
232
    {
233
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
234
        $jobManager = self::$jobManager;
235
236
        $id = $this->createErroredJob();
237
        $archiveObjectName = $jobManager->getArchiveObjectName();
238
        $objectManager = $jobManager->getObjectManager();
239
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
240
        $result = $archiveRepository->find($id);
241
        self::assertNotNull($result);
242
        self::assertEquals(BaseJob::STATUS_ERROR, $result->getStatus());
243
        if ($objectManager instanceof EntityManager) {
244
            JobManagerTest::createObjectManager();
245
            $jobManager = new self::$jobManagerClass(self::$objectManager, self::$objectName, self::$archiveObjectName, self::$runClass, self::$runArchiveClass);
246
            $jobManager->getObjectManager()->clear();
247
            $objectManager = $jobManager->getObjectManager();
248
        }
249
250
        $count = $jobManager->resetErroneousJobs();
251
252
        self::assertEquals(1, $count);
253
        $repository = $jobManager->getRepository();
254
        $job = $repository->find($id);
255
256
        self::assertNotNull($job);
257
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
258
        self::assertNull($job->getLockedAt());
259
        self::assertNull($job->getFinishedAt());
260
        self::assertNull($job->getElapsed());
261
        self::assertNull($job->getMessage());
262
        self::assertNull($job->getLocked());
263
264
        $objectManager->remove($job);
265
        $objectManager->flush();
266
267
        $id = $this->createErroredJob();
268
        $archiveObjectName = $jobManager->getArchiveObjectName();
269
        $objectManager = $jobManager->getObjectManager();
270
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
271
        $result = $archiveRepository->find($id);
272
        $result->setMaxRetries(10);
273
        $result->setRetries(10);
274
        $objectManager->persist($result);
275
        $objectManager->flush();
276
        $count = $jobManager->resetErroneousJobs();
277
        self::assertEquals(0, $count);
278
        $job = $repository->find($id);
279
        self::assertNull($job);
280
        $job = $archiveRepository->find($id);
281
        self::assertNotNull($job);
282
        $objectManager->remove($job);
283
        $objectManager->flush();
284
    }
285
286
    protected function createErroredJob()
287
    {
288
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
289
        $jobManager = self::$jobManager;
290
291
        /** @var Job $job */
292
        $job = $this->getJob();
293
        $id = $job->getId();
294
        $jobManager->deleteJob($job);
295
296
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
297
        $archiveObjectName = $jobManager->getArchiveObjectName();
298
299
        $objectManager = $jobManager->getObjectManager();
300
301
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
302
        $result = $archiveRepository->find($id);
303
        self::assertNotNull($result);
304
        self::assertEquals($id, $result->getId());
305
306
        $result->setStatus(BaseJob::STATUS_ERROR);
307
        $result->setLocked(true);
308
        $result->setLockedAt(new \DateTime());
309
        $result->setFinishedAt(new \DateTime());
310
        $result->setElapsed(12345);
311
        $result->setMessage('soomething');
312
        $objectManager->persist($result);
313
        $objectManager->flush();
314
315
        return $id;
316
    }
317
318
    /**
319
     * @param bool $flushRun
0 ignored issues
show
Bug introduced by
There is no parameter named $flushRun. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
320
     *
321
     * @return mixed
322
     */
323
    public function createStalledJob($endRun, $setId)
324
    {
325
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
326
        $jobManager = self::$jobManager;
327
328
        $job = new self::$jobClass(self::$worker, false, null);
329
        $job->fibonacci(1);
330
        self::assertNotNull($job->getId(), 'Job id should be generated');
331
        $job->setStatus(BaseJob::STATUS_RUNNING);
332
        $job->setLocked(true);
333
        $time = time();
334
        $date = new \DateTime("@$time");
335
        $job->setLockedAt($date);
336
        $id = $job->getId();
337
        $job = $jobManager->getRepository()->find($id);
338
339
        self::assertNotNull($job);
340
341
        $runClass = $jobManager->getRunClass();
342
343
        $objectManager = $jobManager->getObjectManager();
344
        $run = new $runClass();
345
        $run->setLastHeartbeatAt(new \DateTime());
346
        if ($setId) {
347
            $run->setCurrentJobId($job->getId());
348
        }
349
        $objectManager->persist($run);
350
        $objectManager->flush();
351
        $runId = $run->getId();
352
        self::assertNotNull($runId);
353
        $job->setRunId($runId);
354
        $objectManager->persist($job);
355
        $objectManager->flush();
356
        if ($endRun) {
357
            $objectManager->remove($run);
358
            $objectManager->flush();
359
        }
360
        $id = $job->getId();
361
        $job = $jobManager->getRepository()->find($id);
362
363
        self::assertNotNull($job);
364
365
        if ($endRun) {
366
            $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
367
368
            $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
369
            $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
370
371
            $objectManager->persist($archivedRun);
372
            $objectManager->flush();
373
        }
374
        $id = $job->getId();
375
376
        return $id;
377
    }
378
379
    public function testResetStalledJobs()
380
    {
381
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
382
        $jobManager = self::$jobManager;
383
        $id = $this->createStalledJob(true, false);
384
385
        $objectManager = $jobManager->getObjectManager();
386
        $count = $jobManager->resetStalledJobs();
387
        self::assertEquals(1, $count);
388
389
        $job = $jobManager->getRepository()->find($id);
390
391
        self::assertNotNull($job);
392
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
393
        self::assertNull($job->getLockedAt());
394
        self::assertNull($job->getFinishedAt());
395
        self::assertNull($job->getElapsed());
396
        self::assertNull($job->getMessage());
397
        self::assertNull($job->getLocked());
398
        self::assertEquals(1, $job->getStalledCount());
399
400
        $objectManager->remove($job);
401
        $objectManager->flush();
402
403
        $jobManager = self::$jobManager;
404
        $id = $this->createStalledJob(true, true);
405
406
        $objectManager = $jobManager->getObjectManager();
407
        $count = $jobManager->resetStalledJobs();
408
        self::assertEquals(1, $count);
409
410
        $job = $jobManager->getRepository()->find($id);
411
412
        self::assertNotNull($job);
413
        $objectManager->remove($job);
414
        $objectManager->flush();
415
416
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
417
        $id = $this->createStalledJob(false, false);
418
419
        $objectManager = $jobManager->getObjectManager();
420
        $count = $jobManager->resetStalledJobs();
421
        self::assertEquals(1, $count);
422
423
        $job = $jobManager->getRepository()->find($id);
424
425
        self::assertNotNull($job);
426
        self::assertEquals(BaseJob::STATUS_NEW, $job->getStatus());
427
        self::assertNull($job->getLockedAt());
428
        self::assertNull($job->getFinishedAt());
429
        self::assertNull($job->getElapsed());
430
        self::assertNull($job->getMessage());
431
        self::assertNull($job->getLocked());
432
        self::assertEquals(1, $job->getStalledCount());
433
434
        $objectManager->remove($job);
435
        $objectManager->flush();
436
437
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
438
        $jobManager = self::$jobManager;
439
        $id = $this->createStalledJob(false, true);
440
441
        $job = $jobManager->getRepository()->find($id);
442
        $objectManager = $jobManager->getObjectManager();
443
        $count = $jobManager->resetStalledJobs();
444
        self::assertEquals(0, $count);
445
446
        $objectManager->remove($job);
447
        $objectManager->flush();
448
449
        $id = $this->createStalledJob(true, false);
450
        $job = $jobManager->getRepository()->find($id);
451
        $job->setMaxRetries(10);
452
        $job->setRetries(10);
453
        $objectManager->persist($job);
454
        $objectManager->flush();
455
456
        $count = $jobManager->resetStalledJobs();
457
        self::assertEquals(0, $count);
458
        $job = $jobManager->getRepository()->find($id);
459
        self::assertNull($job);
460
        $job = $objectManager->getRepository($jobManager->getArchiveObjectName())->find($id);
461
        self::assertNotNull($job);
462
        $objectManager->remove($job);
463
        $objectManager->flush();
464
465
        $id = $this->createStalledJob(true, false);
466
        $job = $jobManager->getRepository()->find($id);
467
        $job->setMaxStalled(10);
468
        $job->setStalledCount(10);
469
        $objectManager->persist($job);
470
        $objectManager->flush();
471
472
        $count = $jobManager->resetStalledJobs();
473
        self::assertEquals(0, $count);
474
        $job = $jobManager->getRepository()->find($id);
475
        self::assertNull($job);
476
        $job = $objectManager->getRepository($jobManager->getArchiveObjectName())->find($id);
477
        self::assertNotNull($job);
478
        $objectManager->remove($job);
479
        $objectManager->flush();
480
    }
481
482
    public function testPruneErroneousJobs()
483
    {
484
        $job = $this->getJob();
485
        $id = $job->getId();
486
487
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
488
        $jobManager = self::$jobManager;
489
        $jobManager->deleteJob($job);
490
        $archiveObjectName = $jobManager->getArchiveObjectName();
491
492
        $objectManager = $jobManager->getObjectManager();
493
494
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
495
        $result = $archiveRepository->find($id);
496
        self::assertNotNull($result);
497
        self::assertEquals($id, $result->getId());
498
499
        $result->setStatus(BaseJob::STATUS_ERROR);
500
        $result->setLocked(true);
501
        $result->setLockedAt(new \DateTime());
502
        $result->setFinishedAt(new \DateTime());
503
        $result->setElapsed(12345);
504
        $result->setMessage('soomething');
505
        $objectManager->persist($result);
506
        $objectManager->flush();
507
508
        $count = $jobManager->pruneErroneousJobs('asdf');
509
        self::assertEquals(0, $count);
510
        $count = $jobManager->pruneErroneousJobs(null, 'asdf');
511
        self::assertEquals(0, $count);
512
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'asdf');
513
        self::assertEquals(0, $count);
514
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'asdf');
515
        self::assertEquals(0, $count);
516
        $count = $jobManager->pruneErroneousJobs('fibonacci', 'fibonacci');
517
        self::assertEquals(1, $count);
518
        $repository = $jobManager->getRepository();
519
        $job = $repository->find($id);
520
        $objectManager->clear();
521
        self::assertNull($job);
522
        $archiveJob = $archiveRepository->find($id);
523
        self::assertNull($archiveJob);
524
525
        $job = $this->getJob();
526
        $id = $job->getId();
527
        $objectManager->remove($job);
528
        $objectManager->flush();
529
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
530
        $jobManager = self::$jobManager;
531
        $archiveObjectName = $jobManager->getArchiveObjectName();
532
533
        $objectManager = $jobManager->getObjectManager();
534
535
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
536
        $result = $archiveRepository->find($id);
537
        self::assertNotNull($result);
538
        self::assertEquals($id, $result->getId());
539
540
        $result->setStatus(BaseJob::STATUS_ERROR);
541
        $result->setLocked(true);
542
        $result->setLockedAt(new \DateTime());
543
        $result->setFinishedAt(new \DateTime());
544
        $result->setElapsed(12345);
545
        $result->setMessage('soomething');
546
        $objectManager->persist($result);
547
        $objectManager->flush();
548
549
        $job = $this->getJob();
550
        $id = $job->getId();
551
        $objectManager->remove($job);
552
        $objectManager->flush();
553
554
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
555
        $jobManager = self::$jobManager;
556
        $archiveObjectName = $jobManager->getArchiveObjectName();
557
        $objectManager = $jobManager->getObjectManager();
558
559
        $archiveRepository = $objectManager->getRepository($archiveObjectName);
560
        $result = $archiveRepository->find($id);
561
        self::assertNotNull($result);
562
        self::assertEquals($id, $result->getId());
563
564
        $result->setStatus(BaseJob::STATUS_ERROR);
565
        $result->setLocked(true);
566
        $result->setLockedAt(new \DateTime());
567
        $result->setFinishedAt(new \DateTime());
568
        $result->setElapsed(12345);
569
        $result->setMessage('soomething');
570
        $objectManager->persist($result);
571
        $objectManager->flush();
572
        $count = $jobManager->pruneErroneousJobs();
573
        self::assertEquals(2, $count);
574
    }
575
576
    public function testPruneStalledJobs()
577
    {
578
        static::setUpBeforeClass();
579
580
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
581
        $jobManager = self::$jobManager;
582
583
        $job = new self::$jobClass(self::$worker, false, null);
584
        $job->fibonacci(1);
585
        self::assertNotNull($job->getId(), 'Job id should be generated');
586
        $job->setStatus(BaseJob::STATUS_RUNNING);
587
        $job->setLocked(true);
588
        $time = time();
589
        $date = new \DateTime("@$time");
590
        $job->setLockedAt($date);
591
        $id = $job->getId();
592
        $job = $jobManager->getRepository()->find($id);
593
594
        self::assertNotNull($job);
595
596
        $runClass = $jobManager->getRunClass();
597
598
        $objectManager = $jobManager->getObjectManager();
599
        $run = new $runClass();
600
        $run->setLastHeartbeatAt(new \DateTime());
601
        $objectManager->persist($run);
602
        $objectManager->flush();
603
        $runId = $run->getId();
604
        self::assertNotNull($runId);
605
        $job->setRunId($runId);
606
        $objectManager->persist($job);
607
        $objectManager->flush();
608
        $objectManager->remove($run);
609
        $objectManager->flush();
610
        $id = $job->getId();
611
        $job = $jobManager->getRepository()->find($id);
612
613
        self::assertNotNull($job);
614
615
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
616
617
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
618
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
619
620
        $objectManager->persist($archivedRun);
621
        $objectManager->flush();
622
623
        $count = $jobManager->pruneStalledJobs('asdf');
624
        self::assertEquals(0, $count);
625
        $count = $jobManager->pruneStalledJobs(null, 'asdf');
626
        self::assertEquals(0, $count);
627
        $count = $jobManager->pruneStalledJobs('fibonacci', 'asdf');
628
        self::assertEquals(0, $count);
629
        $count = $jobManager->pruneStalledJobs('fibonacci', 'fibonacci');
630
        self::assertEquals(1, $count);
631
632
        $job = $jobManager->getRepository()->find($id);
633
634
        self::assertNull($job);
635
636
        $archivedJob = $jobManager->getObjectManager()->getRepository($jobManager->getArchiveObjectName())->find($id);
637
638
        self::assertNotNull($archivedJob);
639
        self::assertEquals(BaseJob::STATUS_ERROR, $archivedJob->getStatus());
640
        self::assertEquals(1, $archivedJob->getStalledCount());
641
        $objectManager->remove($archivedJob);
642
        $objectManager->flush();
643
644
        // multiple
645
646
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
647
        $jobManager = self::$jobManager;
648
649
        $job = new self::$jobClass(self::$worker, false, null);
650
        $job->fibonacci(1);
651
        self::assertNotNull($job->getId(), 'Job id should be generated');
652
        $job->setStatus(BaseJob::STATUS_RUNNING);
653
        $job->setLocked(true);
654
        $time = time();
655
        $date = new \DateTime("@$time");
656
        $job->setLockedAt($date);
657
        $id = $job->getId();
658
        $job = $jobManager->getRepository()->find($id);
659
660
        self::assertNotNull($job);
661
662
        $runClass = $jobManager->getRunClass();
663
664
        $objectManager = $jobManager->getObjectManager();
665
        $run = new $runClass();
666
        $run->setLastHeartbeatAt(new \DateTime());
667
        $objectManager->persist($run);
668
        $objectManager->flush();
669
        $runId = $run->getId();
670
        self::assertNotNull($runId);
671
        $job->setRunId($runId);
672
        $objectManager->persist($job);
673
        $objectManager->flush();
674
        $objectManager->remove($run);
675
        $objectManager->flush();
676
        $id = $job->getId();
677
        $job = $jobManager->getRepository()->find($id);
678
679
        self::assertNotNull($job);
680
681
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
682
683
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
684
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
685
686
        $objectManager->persist($archivedRun);
687
        $objectManager->flush();
688
689
        $job = new self::$jobClass(self::$worker, false, null);
690
        $job->fibonacci(1);
691
        self::assertNotNull($job->getId(), 'Job id should be generated');
692
        $job->setStatus(BaseJob::STATUS_RUNNING);
693
        $job->setLocked(true);
694
        $time = time();
695
        $date = new \DateTime("@$time");
696
        $job->setLockedAt($date);
697
        $id = $job->getId();
698
        $job = $jobManager->getRepository()->find($id);
699
700
        self::assertNotNull($job);
701
702
        $runClass = $jobManager->getRunClass();
703
704
        $objectManager = $jobManager->getObjectManager();
705
        $run = new $runClass();
706
        $run->setLastHeartbeatAt(new \DateTime());
707
        $objectManager->persist($run);
708
        $objectManager->flush();
709
        $runId = $run->getId();
710
        self::assertNotNull($runId);
711
        $job->setRunId($runId);
712
        $objectManager->persist($job);
713
        $objectManager->flush();
714
        $objectManager->remove($run);
715
        $objectManager->flush();
716
        $id = $job->getId();
717
        $job = $jobManager->getRepository()->find($id);
718
719
        self::assertNotNull($job);
720
721
        $archivedRun = $objectManager->getRepository($jobManager->getRunArchiveClass())->find($runId);
722
723
        $minusTime = $time - (BaseJobManager::STALLED_SECONDS + 1);
724
        $archivedRun->setEndedAt(new \DateTime("@$minusTime"));
725
726
        $objectManager->persist($archivedRun);
727
        $objectManager->flush();
728
        $count = $jobManager->pruneStalledJobs();
729
        self::assertEquals(2, $count);
730
    }
731
732
    public function testBatchJobs()
733
    {
734
        $jobs = self::$jobManager->getRepository()->findAll();
735
        foreach ($jobs as $job) {
736
            self::$jobManager->getObjectManager()->remove($job);
737
        }
738
        self::$jobManager->getObjectManager()->flush();
739
        self::$jobManager->getObjectManager()->clear();
740
741
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
742
        $worker = self::$worker;
743
        $job1 = $worker->later()->fibonacci(1);
744
        $job2 = $worker->batchLater()->fibonacci(1);
745
        self::assertEquals($job1, $job2);
746
747
        $jobs = self::$jobManager->getRepository()->findAll();
748
        self::assertCount(1, $jobs);
749
        self::assertEquals($job1, $jobs[0]);
750
        self::assertNull($jobs[0]->getPriority());
751
        self::$jobManager->getObjectManager()->remove($jobs[0]);
752
        self::$jobManager->getObjectManager()->flush();
753
        self::$jobManager->getObjectManager()->clear();
754
755
        $job1 = $worker->later()->fibonacci(1);
756
        self::assertNull($job1->getPriority());
757
        $job2 = $worker->batchLater()->setPriority(3)->fibonacci(1);
758
        self::assertEquals($job1, $job2);
759
        self::assertNotNull($job2->getPriority());
760
761
        $jobs = self::$jobManager->getRepository()->findAll();
762
        self::assertCount(1, $jobs);
763
        self::assertEquals($job1, $jobs[0]);
764
        self::assertNotNull($jobs[0]->getPriority());
765
766
        // Not
767
        $jobs = self::$jobManager->getRepository()->findAll();
768
        foreach ($jobs as $job) {
769
            self::$jobManager->getObjectManager()->remove($job);
770
        }
771
        self::$jobManager->getObjectManager()->remove($jobs[0]);
772
        self::$jobManager->getObjectManager()->flush();
773
        self::$jobManager->getObjectManager()->clear();
774
775
        $job1 = $worker->later(100)->fibonacci(1);
776
777
        $time1 = new \DateTime('@'.time());
778
        $job2 = $worker->batchLater(0)->fibonacci(1);
779
        $time2 = new \DateTime();
780
781
        self::assertEquals($job1, $job2);
782
        self::assertGreaterThanOrEqual($time1, $job2->getWhenAt());
783
        self::assertLessThanOrEqual($time2, $job2->getWhenAt());
784
785
        $jobs = self::$jobManager->getRepository()->findAll();
786
        self::assertCount(1, $jobs);
787
        self::assertEquals($job1, $jobs[0]);
788
        self::assertGreaterThanOrEqual($time1, $jobs[0]->getWhenAt());
789
        self::assertLessThanOrEqual($time2, $jobs[0]->getWhenAt());
790
        self::$jobManager->getObjectManager()->remove($jobs[0]);
791
        self::$jobManager->getObjectManager()->flush();
792
        self::$jobManager->getObjectManager()->clear();
793
794
        $job1 = $worker->later(100)->setPriority(3)->fibonacci(1);
795
        $priority1 = $job1->getPriority();
796
        $time1 = new \DateTime('@'.time());
797
        $job2 = $worker->batchLater(0)->setPriority(1)->fibonacci(1);
798
        $time2 = new \DateTime();
799
        self::assertEquals($job1, $job2);
800
        self::assertNotEquals($priority1, $job2->getPriority());
801
802
        self::assertEquals($job1, $job2);
803
        self::assertGreaterThanOrEqual($time1, $job2->getWhenAt());
804
        self::assertLessThanOrEqual($time2, $job2->getWhenAt());
805
    }
806
807
    public function testPruneExpiredJobs()
808
    {
809
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
810
        $jobManager = self::$jobManager;
811
        $objectManager = $jobManager->getObjectManager();
812
813
        $job = new self::$jobClass(self::$worker, false, null);
814
        $job->fibonacci(1);
815
        self::assertNotNull($job->getId(), 'Job id should be generated');
816
        $time = time() - 1;
817
        $date = new \DateTime("@$time");
818
        $job->setExpiresAt($date);
819
        $objectManager->persist($job);
820
        $objectManager->flush();
821
822
        $count = $jobManager->pruneExpiredJobs('asdf');
823
        self::assertEquals(0, $count);
824
        $count = $jobManager->pruneExpiredJobs(null, 'asdf');
825
        self::assertEquals(0, $count);
826
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
827
        self::assertEquals(1, $count);
828
829
        $job = new self::$jobClass(self::$worker, false, null);
830
        $job->fibonacci(1);
831
        self::assertNotNull($job->getId(), 'Job id should be generated');
832
        $time = time() - 1;
833
        $date = new \DateTime("@$time");
834
        $job->setExpiresAt($date);
835
        $objectManager->persist($job);
836
        $objectManager->flush();
837
838
        $job = new self::$jobClass(self::$worker, false, null);
839
        $job->fibonacci(1);
840
        self::assertNotNull($job->getId(), 'Job id should be generated');
841
        $time = time() - 1;
842
        $date = new \DateTime("@$time");
843
        $job->setExpiresAt($date);
844
        $objectManager->persist($job);
845
        $objectManager->flush();
846
847
        $count = $jobManager->pruneExpiredJobs(null, 'fibonacci');
848
        self::assertEquals(2, $count);
849
850
        $job = new self::$jobClass(self::$worker, false, null);
851
        $job->fibonacci(1);
852
        self::assertNotNull($job->getId(), 'Job id should be generated');
853
        $time = time() - 1;
854
        $date = new \DateTime("@$time");
855
        $job->setExpiresAt($date);
856
        $objectManager->persist($job);
857
        $objectManager->flush();
858
859
        $job = new self::$jobClass(self::$worker, false, null);
860
        $job->fibonacci(1);
861
        self::assertNotNull($job->getId(), 'Job id should be generated');
862
        $time = time() - 1;
863
        $date = new \DateTime("@$time");
864
        $job->setExpiresAt($date);
865
        $objectManager->persist($job);
866
        $objectManager->flush();
867
868
        $count = $jobManager->pruneExpiredJobs('fibonacci', 'fibonacci');
869
        self::assertEquals(2, $count);
870
871
        $job = new self::$jobClass(self::$worker, false, null);
872
        $job->fibonacci(1);
873
        self::assertNotNull($job->getId(), 'Job id should be generated');
874
        $time = time() - 1;
875
        $date = new \DateTime("@$time");
876
        $job->setExpiresAt($date);
877
        $objectManager->persist($job);
878
        $objectManager->flush();
879
880
        $job = new self::$jobClass(self::$worker, false, null);
881
        $job->fibonacci(1);
882
        self::assertNotNull($job->getId(), 'Job id should be generated');
883
        $time = time() - 1;
884
        $date = new \DateTime("@$time");
885
        $job->setExpiresAt($date);
886
        $objectManager->persist($job);
887
        $objectManager->flush();
888
889
        $count = $jobManager->pruneExpiredJobs('fibonacci');
890
        self::assertEquals(2, $count);
891
892
        $job = new self::$jobClass(self::$worker, false, null);
893
        $job->fibonacci(1);
894
        self::assertNotNull($job->getId(), 'Job id should be generated');
895
        $time = time() - 1;
896
        $date = new \DateTime("@$time");
897
        $job->setExpiresAt($date);
898
        $objectManager->persist($job);
899
        $objectManager->flush();
900
901
        $jobId1 = $job->getId();
902
903
        $job = new self::$jobClass(self::$worker, false, null);
904
        $job->fibonacci(1);
905
        self::assertNotNull($job->getId(), 'Job id should be generated');
906
        $time = time() - 1;
907
        $date = new \DateTime("@$time");
908
        $job->setExpiresAt($date);
909
        $objectManager->persist($job);
910
        $objectManager->flush();
911
912
        $jobId2 = $job->getId();
913
914
        $count = $jobManager->pruneExpiredJobs();
915
        self::assertEquals(2, $count);
916
917
        $archiveRepository = $jobManager->getObjectManager()->getRepository($jobManager->getArchiveObjectName());
918
919
        $job = $archiveRepository->find($jobId1);
920
        self::assertNotNull($job);
921
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
922
923
        $job = $archiveRepository->find($jobId2);
924
        self::assertNotNull($job);
925
        self::assertEquals(Job::STATUS_EXPIRED, $job->getStatus());
926
    }
927
928
    public function testPruneArchivedJobs()
929
    {
930
        /** @var JobManager|\Dtc\QueueBundle\ORM\JobManager $jobManager */
931
        $jobManager = self::$jobManager;
932
        $objectManager = $jobManager->getObjectManager();
933
        $jobArchiveClass = $jobManager->getArchiveObjectName();
934
        $jobArchiveRepository = $objectManager->getRepository($jobArchiveClass);
935
936
        self::$objectManager->getEventManager()->removeEventListener('preUpdate', self::$dtcQueueListener);
937
938
        $job = new self::$jobClass(self::$worker, false, null);
939
        $job->fibonacci(1);
940
        $id = $job->getId();
941
        $objectManager->remove($job);
942
        $objectManager->flush();
943
944
        $jobArchive = $jobArchiveRepository->find($id);
945
        self::assertNotNull($jobArchive);
946
        $time = time() - 86401;
947
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
948
        $objectManager->persist($jobArchive);
949
        $objectManager->flush();
950
951
        $older = $time + 1;
952
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
953
        self::assertEquals(0, $count);
954
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
955
        self::assertEquals(1, $count);
956
957
        $job = new self::$jobClass(self::$worker, false, null);
958
        $job->fibonacci(1);
959
        $id = $job->getId();
960
        $objectManager->remove($job);
961
        $objectManager->flush();
962
963
        $jobArchive = $jobArchiveRepository->find($id);
964
        self::assertNotNull($jobArchive);
965
        $time = time() - 86401;
966
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
967
        $objectManager->persist($jobArchive);
968
        $objectManager->flush();
969
970
        $job = new self::$jobClass(self::$worker, false, null);
971
        $job->fibonacci(1);
972
        $id = $job->getId();
973
        $objectManager->remove($job);
974
        $objectManager->flush();
975
976
        $jobArchive = $jobArchiveRepository->find($id);
977
        self::assertNotNull($jobArchive);
978
        $jobArchive->setUpdatedAt(new \DateTime("@$time"));
979
        $objectManager->persist($jobArchive);
980
        $objectManager->flush();
981
        $older = $time + 1;
982
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$time"));
983
        self::assertEquals(0, $count);
984
        $count = $jobManager->pruneArchivedJobs(new \DateTime("@$older"));
985
        self::assertEquals(2, $count);
986
987
        self::$objectManager->getEventManager()->addEventListener('preUpdate', self::$dtcQueueListener);
988
    }
989
990
    public function testPerformance()
991
    {
992
        $jobs = self::$jobManager->getRepository()->findAll();
993
        foreach ($jobs as $job) {
994
            self::$jobManager->getObjectManager()->remove($job);
995
        }
996
        self::$jobManager->getObjectManager()->flush();
997
998
        self::$jobManager->getObjectManager()->clear();
999
        parent::testPerformance();
1000
    }
1001
1002
    protected function getBaseStatus()
1003
    {
1004
        /** @var BaseJobManager $jobManager */
1005
        $jobManager = self::$jobManager;
1006
        $job = new self::$jobClass(self::$worker, false, null);
1007
        $job->fibonacci(1);
1008
        $status = $jobManager->getStatus();
1009
        self::assertArrayHasKey('fibonacci->fibonacci()', $status);
1010
        $fibonacciStatus = $status['fibonacci->fibonacci()'];
1011
1012
        self::assertArrayHasKey(BaseJob::STATUS_NEW, $fibonacciStatus);
1013
        self::assertArrayHasKey(BaseJob::STATUS_ERROR, $fibonacciStatus);
1014
        self::assertArrayHasKey(BaseJob::STATUS_RUNNING, $fibonacciStatus);
1015
        self::assertArrayHasKey(BaseJob::STATUS_SUCCESS, $fibonacciStatus);
1016
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_STALLED, $fibonacciStatus);
1017
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_ERROR, $fibonacciStatus);
1018
        self::assertArrayHasKey(RetryableJob::STATUS_MAX_RETRIES, $fibonacciStatus);
1019
        self::assertArrayHasKey(RetryableJob::STATUS_EXPIRED, $fibonacciStatus);
1020
1021
        return [$job, $status];
1022
    }
1023
1024
    public function testGetStatus()
1025
    {
1026
        list($job1, $status1) = $this->getBaseStatus();
1027
        list($job2, $status2) = $this->getBaseStatus();
1028
        $fibonacciStatus1 = $status1['fibonacci->fibonacci()'];
1029
        $fibonacciStatus2 = $status2['fibonacci->fibonacci()'];
1030
1031
        self::assertEquals($fibonacciStatus1[BaseJob::STATUS_NEW] + 1, $fibonacciStatus2[BaseJob::STATUS_NEW]);
1032
        $jobManager = self::$jobManager;
1033
        $objectManager = $jobManager->getObjectManager();
1034
        $objectManager->remove($job1);
1035
        $objectManager->remove($job2);
1036
    }
1037
}
1038