8000 [Scheduler] Save checkpoint in a finally block · symfony/symfony@598d5bd · GitHub
[go: up one dir, main page]

Skip to content

Commit 598d5bd

Browse files
FrancoisPogfabpot
authored andcommitted
[Scheduler] Save checkpoint in a finally block
1 parent a9b9e4e commit 598d5bd

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/Symfony/Component/Scheduler/Generator/MessageGenerator.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,11 @@ public function getMessages(): \Generator
7272
}
7373

7474
if ($yield) {
75-
yield (new MessageContext($this->name, $id, $trigger, $time, $nextTime)) => $message;
76-
$checkpoint->save($time, $index);
75+
try {
76+
yield (new MessageContext($this->name, $id, $trigger, $time, $nextTime)) => $message;
77+
} finally {
78+
$checkpoint->save($time, $index);
79+
}
7780
}
7881
}
7982

src/Symfony/Component/Scheduler/Tests/Generator/MessageGeneratorTest.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Cache\Adapter\ArrayAdapter;
1616
use Symfony\Component\Clock\ClockInterface;
17+
use Symfony\Component\Clock\MockClock;
18+
use Symfony\Component\Scheduler\Generator\Checkpoint;
1719
use Symfony\Component\Scheduler\Generator\MessageContext;
1820
use Symfony\Component\Scheduler\Generator\MessageGenerator;
1921
use Symfony\Component\Scheduler\RecurringMessage;
@@ -128,6 +130,32 @@ public function testYieldedContext()
128130
$this->assertEquals(self::makeDateTime('22:16:00'), $context->nextTriggerAt);
129131
}
130132

133+
public function testCheckpointSavedInBrokenLoop()
134+
{
135+
$clock = new MockClock(self::makeDateTime('22:12:00'));
136+
137+
$message = $this->createMessage((object) ['id' => 'message'], '22:13:00', '22:14:00', '22:16:00');
138+
$schedule = (new Schedule())->add($message);
139+
140+
$cache = new ArrayAdapter();
141+
$schedule->stateful($cache);
142+
$checkpoint = new Checkpoint('dummy', cache: $cache);
143+
144+
$scheduler = new MessageGenerator($schedule, 'dummy', clock: $clock, checkpoint: $checkpoint);
145+
146+
// Warmup. The first run is always returns nothing.
147+
$this->assertSame([], iterator_to_array($scheduler->getMessages(), false));
148+
149+
$clock->sleep(60 + 10); // 22:13:10
150+
151+
foreach ($scheduler->getMessages() as $message) {
152+
// Message is handled but loop is broken just after
153+
break;
154+
}
155+
156+
$this->assertEquals(self::makeDateTime('22:13:00'), $checkpoint->time());
157+
}
158+
131159
public static function messagesProvider(): \Generator
132160
{
133161
$first = (object) ['id' => 'first'];

0 commit comments

Comments
 (0)
0