Skip to content

Commit 2d46f31

Browse files
authored
Merge pull request #25 from netlogix/feat/rename-retry-object
feat: Rename Retry to SchedulingCoordinator
2 parents e57efc9 + 0d9aea0 commit 2d46f31

9 files changed

Lines changed: 82 additions & 41 deletions

File tree

Classes/Command/SchedulerCommandController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Neos\Flow\Log\ThrowableStorageInterface;
1515
use Netlogix\JobQueue\Scheduled\AsScheduledJob\SchedulingInformation;
1616
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
17-
use Netlogix\JobQueue\Scheduled\Domain\Retry;
17+
use Netlogix\JobQueue\Scheduled\Domain\SchedulingCoordinator;
1818
use Netlogix\JobQueue\Scheduled\Domain\Scheduler;
1919

2020
/**
@@ -103,7 +103,7 @@ public function pollForIncomingJobsCommand(string $groupName): void
103103
protected function queueDueJobs(string $groupName, int $endTime): int
104104
{
105105
$numberOfHandledJobs = 0;
106-
$retry = new Retry($this->scheduler);
106+
$retry = new SchedulingCoordinator($this->scheduler);
107107

108108
while ($next = $this->scheduler->next($groupName)) {
109109
try {

Classes/Domain/Scheduler.php

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
namespace Netlogix\JobQueue\Scheduled\Domain;
66

77
use DateTimeImmutable;
8+
use Doctrine\DBAL\Exception\RetryableException;
89
use Doctrine\DBAL\Types\Types;
910
use InvalidArgumentException;
1011
use Neos\Flow\Utility\Algorithms;
1112
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
1213
use Netlogix\JobQueue\Scheduled\DueDateCalculation\TimeBaseForDueDateCalculation;
1314
use Netlogix\JobQueue\Scheduled\Service\Connection;
15+
use Netlogix\Retry\Retry;
1416

1517
use function array_filter;
1618
use function in_array;
@@ -108,20 +110,26 @@ public function next(string $groupName): ?ScheduledJob
108110
SET claimed = :claimed
109111
WHERE claimed = ""
110112
';
111-
$this->dbal
112-
->executeQuery(
113-
$update,
114-
[
115-
'now' => $this->timeBaseForDueDateCalculation->getNow(),
116-
'groupname' => $groupName,
117-
'claimed' => $claim,
118-
],
119-
[
120-
'now' => Types::DATETIME_IMMUTABLE,
121-
'groupname' => Types::STRING,
122-
'claimed' => Types::STRING,
123-
]
124-
);
113+
(new Retry())
114+
/**
115+
* @see http://backoffcalculator.com/?attempts=5&rate=1&interval=0.5
116+
*/
117+
->withExponentialBackoff(retryInterval: 0.5, maxRetries: 5)
118+
->onExceptionsOfType(RetryableException::class)
119+
->task(fn() => $this->dbal
120+
->executeQuery(
121+
$update,
122+
[
123+
'now' => $this->timeBaseForDueDateCalculation->getNow(),
124+
'groupname' => $groupName,
125+
'claimed' => $claim,
126+
],
127+
[
128+
'now' => Types::DATETIME_IMMUTABLE,
129+
'groupname' => Types::STRING,
130+
'claimed' => Types::STRING,
131+
]
132+
));
125133

126134
$select = /** @lang MySQL */ '
127135
SELECT identifier, duedate, queue, job, incarnation, claimed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
1010
use Netlogix\JobQueue\Scheduled\DueDateCalculation\TimeBaseForDueDateCalculation;
1111

12-
class Retry
12+
class SchedulingCoordinator
1313
{
1414
const DEFAULT_BACKOFF_STRATEGY = 'linear';
1515
const DEFAULT_NUMBER_OF_RETRIES = -1;

Tests/Functional/RetrievingTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
namespace Netlogix\JobQueue\Scheduled\Tests\Functional;
55

66
use DateTimeImmutable;
7+
use Doctrine\DBAL\Exception\DeadlockException;
8+
use Doctrine\ORM\EntityManagerInterface;
9+
use Neos\Flow\Persistence\Doctrine\PersistenceManager;
10+
use Neos\Flow\Persistence\PersistenceManagerInterface;
711
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
812
use Netlogix\JobQueue\Scheduled\Domain\Scheduler;
13+
use Netlogix\JobQueue\Scheduled\Service\Connection;
914

1015
class RetrievingTest extends TestCase
1116
{
@@ -117,6 +122,34 @@ public function Scheduled_jobs_can_be_retrieved_only_once(): void
117122
self::assertNull($retrievedJob2);
118123
}
119124

125+
126+
/**
127+
* @test
128+
*/
129+
public function Retry_claiming_when_deadlock_exceptions_happen(): void
130+
{
131+
$connection = self::createMock(Connection::class);
132+
$connection->expects(self::any())
133+
->method('executeQuery')
134+
->willThrowException(self::createStub(DeadlockException::class));
135+
136+
$this->scheduler->injectConnection($connection);
137+
138+
$start = microtime(true);
139+
try {
140+
$this->scheduler->next(Scheduler::DEFAULT_GROUP_NAME);
141+
} catch (DeadlockException $e) {
142+
}
143+
$end = microtime(true);
144+
$delta = $end - $start;
145+
146+
self::assertInstanceOf(DeadlockException::class, $e);
147+
148+
// guesstimated value is 15 and something.
149+
self::assertGreaterThan(14, $delta);
150+
self::assertLessThan(18, $delta);
151+
}
152+
120153
/**
121154
* @test
122155
*/

Tests/Functional/Retry/ExponentialRetryTest.php renamed to Tests/Functional/SchedulingCoordinator/ExponentialRetryTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22
declare(strict_types=1);
33

4-
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\Retry;
4+
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\SchedulingCoordinator;
55

66
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
7-
use Netlogix\JobQueue\Scheduled\Domain\Retry;
7+
use Netlogix\JobQueue\Scheduled\Domain\SchedulingCoordinator;
88
use Netlogix\JobQueue\Scheduled\Domain\Scheduler;
99

1010
class ExponentialRetryTest extends TestCase
@@ -24,7 +24,7 @@ public function Jobs_with_no_retries_dont_get_rescheduled(): void
2424
'some-claim'
2525
);
2626

27-
$retry = new Retry($this->scheduler);
27+
$retry = new SchedulingCoordinator($this->scheduler);
2828
$retry->injectQueueManager($this->queueManager([
2929
'scheduledJobs' => [
3030
'backoffStrategy' => 'exponential',
@@ -53,7 +53,7 @@ public function Jobs_with_negative_retries_get_retried_infinitely(): void
5353
$incarnation
5454
);
5555

56-
$retry = new Retry($this->scheduler);
56+
$retry = new SchedulingCoordinator($this->scheduler);
5757
$retry->injectQueueManager($this->queueManager([
5858
'scheduledJobs' => [
5959
'backoffStrategy' => 'exponential',
@@ -82,7 +82,7 @@ public function Default_interval_is_zero(): void
8282
$incarnation
8383
);
8484

85-
$retry = new Retry($this->scheduler);
85+
$retry = new SchedulingCoordinator($this->scheduler);
8686
$retry->injectQueueManager($this->queueManager([
8787
'scheduledJobs' => [
8888
'backoffStrategy' => 'exponential',
@@ -115,7 +115,7 @@ public function Retry_adds_increasing_date_intervals(int $incarnation, int $dela
115115
$incarnation
116116
);
117117

118-
$retry = new Retry($this->scheduler);
118+
$retry = new SchedulingCoordinator($this->scheduler);
119119
$retry->injectQueueManager($this->queueManager([
120120
'scheduledJobs' => [
121121
'backoffStrategy' => 'exponential',
@@ -173,7 +173,7 @@ public function Retries_are_skipped_after_limit_is_reached(): void
173173
'some-claim'
174174
);
175175

176-
$retry = new Retry($this->scheduler);
176+
$retry = new SchedulingCoordinator($this->scheduler);
177177
$retry->injectQueueManager($this->queueManager([
178178
'scheduledJobs' => [
179179
'backoffStrategy' => 'exponential',

Tests/Functional/Retry/LinearRetryTest.php renamed to Tests/Functional/SchedulingCoordinator/LinearRetryTest.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22
declare(strict_types=1);
33

4-
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\Retry;
4+
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\SchedulingCoordinator;
55

66
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
7-
use Netlogix\JobQueue\Scheduled\Domain\Retry;
7+
use Netlogix\JobQueue\Scheduled\Domain\SchedulingCoordinator;
88
use Netlogix\JobQueue\Scheduled\Domain\Scheduler;
99

1010
class LinearRetryTest extends TestCase
@@ -24,7 +24,7 @@ public function Jobs_with_no_retries_dont_get_rescheduled(): void
2424
'some-claim'
2525
);
2626

27-
$retry = new Retry($this->scheduler);
27+
$retry = new SchedulingCoordinator($this->scheduler);
2828
$retry->injectQueueManager($this->queueManager([
2929
'scheduledJobs' => [
3030
'backoffStrategy' => 'linear',
@@ -53,7 +53,7 @@ public function Jobs_with_negative_retries_get_retried_infinitely(): void
5353
$incarnation
5454
);
5555

56-
$retry = new Retry($this->scheduler);
56+
$retry = new SchedulingCoordinator($this->scheduler);
5757
$retry->injectQueueManager($this->queueManager([
5858
'scheduledJobs' => [
5959
'backoffStrategy' => 'linear',
@@ -82,7 +82,7 @@ public function Default_interval_is_zero(): void
8282
$incarnation
8383
);
8484

85-
$retry = new Retry($this->scheduler);
85+
$retry = new SchedulingCoordinator($this->scheduler);
8686
$retry->injectQueueManager($this->queueManager([
8787
'scheduledJobs' => [
8888
'backoffStrategy' => 'linear',
@@ -115,7 +115,7 @@ public function Retry_adds_the_retryInterval_in_seconds(): void
115115
$incarnation
116116
);
117117

118-
$retry = new Retry($this->scheduler);
118+
$retry = new SchedulingCoordinator($this->scheduler);
119119
$retry->injectQueueManager($this->queueManager([
120120
'scheduledJobs' => [
121121
'backoffStrategy' => 'linear',
@@ -147,7 +147,7 @@ public function Retries_are_skipped_after_limit_is_reached(): void
147147
'some-claim'
148148
);
149149

150-
$retry = new Retry($this->scheduler);
150+
$retry = new SchedulingCoordinator($this->scheduler);
151151
$retry->injectQueueManager($this->queueManager([
152152
'scheduledJobs' => [
153153
'backoffStrategy' => 'linear',

Tests/Functional/Retry/RetryTest.php renamed to Tests/Functional/SchedulingCoordinator/SchedulingTest.php

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
<?php
22
declare(strict_types=1);
33

4-
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\Retry;
4+
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\SchedulingCoordinator;
55

6-
use DateInterval;
76
use Netlogix\JobQueue\Scheduled\Domain\Model\ScheduledJob;
8-
use Netlogix\JobQueue\Scheduled\Domain\Retry;
7+
use Netlogix\JobQueue\Scheduled\Domain\SchedulingCoordinator;
98
use Netlogix\JobQueue\Scheduled\Domain\Scheduler;
109

11-
class RetryTest extends TestCase
10+
class SchedulingTest extends TestCase
1211
{
1312
/**
1413
* @test
@@ -23,7 +22,7 @@ public function Marking_a_job_for_rescheduling_does_not_schedule_it(): void
2322
'my-identifier'
2423
);
2524

26-
$retry = new Retry($this->scheduler);
25+
$retry = new SchedulingCoordinator($this->scheduler);
2726
$retry->markJobForRescheduling($job);
2827

2928
$all = $this->findAll();
@@ -50,7 +49,7 @@ public function Marking_a_job_for_rescheduling_and_scheduling_all_does_not_sched
5049
'my-second-identifier'
5150
);
5251

53-
$retry = new Retry($this->scheduler);
52+
$retry = new SchedulingCoordinator($this->scheduler);
5453
$retry->injectQueueManager($this->queueManager([]));
5554
$retry->markJobForRescheduling($jobA);
5655
$retry->markJobForRescheduling($jobB);
@@ -73,7 +72,7 @@ public function Rescheduling_a_job_only_increases_its_incarnation(): void
7372
'my-first-identifier'
7473
);
7574

76-
$retry = new Retry($this->scheduler);
75+
$retry = new SchedulingCoordinator($this->scheduler);
7776
$retry->injectQueueManager($this->queueManager([]));
7877
$retry->markJobForRescheduling($job);
7978
$retry->scheduleAll();
@@ -102,7 +101,7 @@ public function Expired_jobs_get_removed(): void
102101
$this->persistenceManager->add($job);
103102
$this->persistenceManager->persistAll();
104103

105-
$retry = new Retry($this->scheduler);
104+
$retry = new SchedulingCoordinator($this->scheduler);
106105
$retry->injectQueueManager($this->queueManager([
107106
'scheduledJobs' => [
108107
'backoffStrategy' => 'linear',
@@ -133,7 +132,7 @@ public function Expired_jobs_are_kept_if_the_queue_has_it_configured(): void
133132
$this->persistenceManager->add($job);
134133
$this->persistenceManager->persistAll();
135134

136-
$retry = new Retry($this->scheduler);
135+
$retry = new SchedulingCoordinator($this->scheduler);
137136
$retry->injectQueueManager($this->queueManager([
138137
'scheduledJobs' => [
139138
'backoffStrategy' => 'linear',

Tests/Functional/Retry/TestCase.php renamed to Tests/Functional/SchedulingCoordinator/TestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
declare(strict_types=1);
33

4-
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\Retry;
4+
namespace Netlogix\JobQueue\Scheduled\Tests\Functional\SchedulingCoordinator;
55

66
use DateInterval;
77
use DateTimeImmutable;

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"doctrine/orm": "^2.6",
1414
"flowpack/jobqueue-common": "^3.0",
1515
"neos/flow": "~8.3",
16+
"netlogix/retry": "~1.0",
1617
"php": "~8.2 || ~8.3"
1718
},
1819
"require-dev": {

0 commit comments

Comments
 (0)