Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit cede63f

Browse files
committed
[Scheduler] allow MessageGenerator's to return RecurringMessage[]
- Add `RecurringMessage` to `ScheduledStamp`.
1 parent f2ff84f commit cede63f

File tree

7 files changed

+36
-12
lines changed

7 files changed

+36
-12
lines changed

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Psr\Clock\ClockInterface;
1515
use Symfony\Component\Clock\Clock;
16+
use Symfony\Component\Scheduler\RecurringMessage;
1617
use Symfony\Component\Scheduler\Schedule;
1718
use Symfony\Component\Scheduler\Trigger\TriggerInterface;
1819

@@ -37,6 +38,9 @@ public function __construct(
3738
$this->checkpoint = $checkpoint;
3839
}
3940

41+
/**
42+
* @return \Generator<RecurringMessage>
43+
*/
4044
public function getMessages(): \Generator
4145
{
4246
if (!$this->waitUntil
@@ -54,8 +58,8 @@ public function getMessages(): \Generator
5458
/** @var TriggerInterface $trigger */
5559
/** @var int $index */
5660
/** @var \DateTimeImmutable $time */
57-
/** @var object $message */
58-
[$time, $index, $trigger, $message] = $heap->extract();
61+
/** @var object $recurringMessage */
62+
[$time, $index, $trigger, $recurringMessage] = $heap->extract();
5963
$yield = true;
6064

6165
if ($time < $lastTime) {
@@ -66,11 +70,11 @@ public function getMessages(): \Generator
6670
}
6771

6872
if ($nextTime = $trigger->getNextRunDate($time)) {
69-
$heap->insert([$nextTime, $index, $trigger, $message]);
73+
$heap->insert([$nextTime, $index, $trigger, $recurringMessage]);
7074
}
7175

7276
if ($yield) {
73-
yield $message;
77+
yield $recurringMessage;
7478
$this->checkpoint->save($time, $index);
7579
}
7680
}
@@ -93,7 +97,7 @@ private function heap(\DateTimeImmutable $time): TriggerHeap
9397
continue;
9498
}
9599

96-
$heap->insert([$nextTime, $index, $recurringMessage->getTrigger(), $recurringMessage->getMessage()]);
100+
$heap->insert([$nextTime, $index, $recurringMessage->getTrigger(), $recurringMessage]);
97101
}
98102

99103
return $this->triggerHeap = $heap;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@
1111

1212
namespace Symfony\Component\Scheduler\Generator;
1313

14+
use Symfony\Component\Scheduler\RecurringMessage;
15+
1416
/**
1517
* @experimental
1618
*/
1719
interface MessageGeneratorInterface
1820
{
1921
/**
20-
* @return iterable<object>
22+
* @return iterable<object|RecurringMessage>
2123
*/
2224
public function getMessages(): iterable;
2325
}

src/Symfony/Component/Scheduler/Messenger/ScheduledStamp.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@
1212
namespace Symfony\Component\Scheduler\Messenger;
1313

1414
use Symfony\Component\Messenger\Stamp\NonSendableStampInterface;
15+
use Symfony\Component\Scheduler\RecurringMessage;
1516

1617
/**
1718
* @experimental
1819
*/
1920
final class ScheduledStamp implements NonSendableStampInterface
2021
{
22+
public function __construct(public readonly RecurringMessage $recurringMessage)
23+
{
24+
}
2125
}

src/Symfony/Component/Scheduler/Messenger/SchedulerTransport.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Messenger\Transport\TransportInterface;
1616
use Symfony\Component\Scheduler\Exception\LogicException;
1717
use Symfony\Component\Scheduler\Generator\MessageGeneratorInterface;
18+
use Symfony\Component\Scheduler\RecurringMessage;
1819

1920
/**
2021
* @experimental
@@ -29,7 +30,11 @@ public function __construct(
2930
public function get(): iterable
3031
{
3132
foreach ($this->messageGenerator->getMessages() as $message) {
32-
yield Envelope::wrap($message, [new ScheduledStamp()]);
33+
if (!$message instanceof RecurringMessage) {
34+
throw new LogicException(sprintf('Messages from "%s" must be instances of "%s". Got "%s".', __CLASS__, RecurringMessage::class, get_debug_type($message)));
35+
}
36+
37+
yield Envelope::wrap($message->getMessage(), [new ScheduledStamp($message)]);
3338
}
3439
}
3540

src/Symfony/Component/Scheduler/Scheduler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ public function run(array $options = []): void
6666
$ran = false;
6767
foreach ($this->generators as $generator) {
6868
foreach ($generator->getMessages() as $message) {
69+
if ($message instanceof RecurringMessage) {
70+
$message = $message->getMessage();
71+
}
72+
6973
$this->handlers[$message::class]($message);
7074
$ran = true;
7175
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ public function testGetMessages(string $startTime, array $runs, array $schedule)
4747

4848
foreach ($runs as $time => $expected) {
4949
$now = self::makeDateTime($time);
50-
$this->assertSame($expected, iterator_to_array($scheduler->getMessages()));
50+
$messages = array_map(fn (RecurringMessage $m) => $m->getMessage(), iterator_to_array($scheduler->getMessages()));
51+
$this->assertSame($expected, $messages);
5152
}
5253
}
5354

src/Symfony/Component/Scheduler/Tests/Messenger/SchedulerTransportTest.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,28 @@
1717
use Symfony\Component\Scheduler\Generator\MessageGeneratorInterface;
1818
use Symfony\Component\Scheduler\Messenger\ScheduledStamp;
1919
use Symfony\Component\Scheduler\Messenger\SchedulerTransport;
20+
use Symfony\Component\Scheduler\RecurringMessage;
2021

2122
class SchedulerTransportTest extends TestCase
2223
{
2324
public function testGetFromIterator()
2425
{
2526
$messages = [
26-
(object) ['id' => 'first'],
27-
(object) ['id' => 'second'],
27+
RecurringMessage::cron('* * * * *', (object) ['id' => 'first']),
28+
RecurringMessage::cron('* * * * *', (object) ['id' => 'second']),
2829
];
2930
$generator = $this->createConfiguredMock(MessageGeneratorInterface::class, [
3031
'getMessages' => $messages,
3132
]);
3233
$transport = new SchedulerTransport($generator);
3334

3435
foreach ($transport->get() as $envelope) {
36+
$message = array_shift($messages);
37+
3538
$this->assertInstanceOf(Envelope::class, $envelope);
36-
$this->assertNotNull($envelope->last(ScheduledStamp::class));
37-
$this->assertSame(array_shift($messages), $envelope->getMessage());
39+
$this->assertEquals($message, $envelope->last(ScheduledStamp::class)?->recurringMessage);
40+
$this->assertSame($message->getMessage(), $envelope->getMessage());
41+
$this->assertSame($message->getMessage(), $envelope->getMessage());
3842
}
3943

4044
$this->assertEmpty($messages);

0 commit comments

Comments
 (0)