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

Skip to content

Commit 3664d08

Browse files
committed
[Scheduler] Allow MessageGenerator to provide a MessageContext
And add it to the ScheduledStamp in case of use within Messenger. Replaces 50096 Fix 50085 This approach allows to provie some context that the message consumers can use or not depending on its use case
1 parent c287c5c commit 3664d08

File tree

7 files changed

+82
-7
lines changed

7 files changed

+82
-7
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Scheduler\Generator;
13+
14+
use Symfony\Component\Scheduler\Trigger\TriggerInterface;
15+
16+
/**
17+
* @author Tugdual Saunier <[email protected]>
18+
*
19+
* @experimental
20+
*/
21+
final class MessageContext
22+
{
23+
public function __construct(
24+
public readonly TriggerInterface $trigger,
25+
public readonly \DateTimeImmutable $triggeredAt,
26+
public readonly \DateTimeImmutable|null $nextTriggerAt = null,
27+
) {
28+
}
29+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public function getMessages(): \Generator
7070
}
7171

7272
if ($yield) {
73-
yield $message;
73+
yield (new MessageContext($trigger, $time, $nextTime)) => $message;
7474
$this->checkpoint->save($time, $index);
7575
}
7676
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
interface MessageGeneratorInterface
1818
{
1919
/**
20-
* @return iterable<object>
20+
* @return iterable<MessageContext, object>
2121
*/
2222
public function getMessages(): iterable;
2323
}

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\Generator\MessageContext;
1516

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public function __construct(
2828

2929
public function get(): iterable
3030
{
31-
foreach ($this->messageGenerator->getMessages() as $message) {
32-
yield Envelope::wrap($message, [new ScheduledStamp()]);
31+
foreach ($this->messageGenerator->getMessages() as $context => $message) {
32+
yield Envelope::wrap($message, [new ScheduledStamp($context)]);
3333
}
3434
}
3535

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

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Cache\Adapter\ArrayAdapter;
1616
use Symfony\Component\Clock\ClockInterface;
17+
use Symfony\Component\Scheduler\Generator\MessageContext;
1718
use Symfony\Component\Scheduler\Generator\MessageGenerator;
1819
use Symfony\Component\Scheduler\RecurringMessage;
1920
use Symfony\Component\Scheduler\Schedule;
@@ -43,14 +44,47 @@ public function testGetMessages(string $startTime, array $runs, array $schedule)
4344
$scheduler = new MessageGenerator($schedule, 'dummy', $clock);
4445

4546
// Warmup. The first run is always returns nothing.
46-
$this->assertSame([], iterator_to_array($scheduler->getMessages()));
47+
$this->assertSame([], iterator_to_array($scheduler->getMessages(), false));
4748

4849
foreach ($runs as $time => $expected) {
4950
$now = self::makeDateTime($time);
50-
$this->assertSame($expected, iterator_to_array($scheduler->getMessages()));
51+
$this->assertSame($expected, iterator_to_array($scheduler->getMessages(), false));
5152
}
5253
}
5354

55+
public function testYieldedContext()
56+
{
57+
// for referencing
58+
$now = self::makeDateTime('22:12:00');
59+
60+
$clock = $this->createMock(ClockInterface::class);
61+
$clock->method('now')->willReturnReference($now);
62+
63+
$message = $this->createMessage((object) ['id' => 'message'], '22:13:00', '22:14:00', '22:16:00');
64+
$schedule = (new Schedule())->add($message);
65+
$schedule->stateful(new ArrayAdapter());
66+
67+
$scheduler = new MessageGenerator($schedule, 'dummy', $clock);
68+
69+
// Warmup. The first run is alw ays returns nothing.
70+
$this->assertSame([], iterator_to_array($scheduler->getMessages(), false));
71+
72+
$now = self::makeDateTime('22:14:10');
73+
74+
$iterator = $scheduler->getMessages();
75+
76+
$this->assertInstanceOf(MessageContext::class, $context = $iterator->key());
77+
$this->assertSame($message->getTrigger(), $context->trigger);
78+
$this->assertEquals(self::makeDateTime('22:13:00'), $context->triggeredAt);
79+
$this->assertEquals(self::makeDateTime('22:14:00'), $context->nextTriggerAt);
80+
81+
$iterator->next();
82+
$this->assertInstanceOf(MessageContext::class, $context = $iterator->key());
83+
$this->assertSame($message->getTrigger(), $context->trigger);
84+
$this->assertEquals(self::makeDateTime('22:14:00'), $context->triggeredAt);
85+
$this->assertEquals(self::makeDateTime('22:16:00'), $context->nextTriggerAt);
86+
}
87+
5488
public static function messagesProvider(): \Generator
5589
{
5690
$first = (object) ['id' => 'first'];

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\Messenger\Envelope;
1616
use Symfony\Component\Scheduler\Exception\LogicException;
17+
use Symfony\Component\Scheduler\Generator\MessageContext;
1718
use Symfony\Component\Scheduler\Generator\MessageGeneratorInterface;
1819
use Symfony\Component\Scheduler\Messenger\ScheduledStamp;
1920
use Symfony\Component\Scheduler\Messenger\SchedulerTransport;
21+
use Symfony\Component\Scheduler\Trigger\TriggerInterface;
2022

2123
class SchedulerTransportTest extends TestCase
2224
{
@@ -26,9 +28,15 @@ public function testGetFromIterator()
2628
(object) ['id' => 'first'],
2729
(object) ['id' => 'second'],
2830
];
29-
$generator = $this->createConfiguredMock(MessageGeneratorInterface::class, [
31+
$generator = $this->createMock(MessageGeneratorInterface::class, [
3032
'getMessages' => $messages,
3133
]);
34+
$generator->method('getMessages')->willReturnCallback(function () use ($messages): \Generator {
35+
$trigger = $this->createMock(TriggerInterface::class);
36+
$triggerAt = new \DateTimeImmutable('2020-02-20T02:00:00', new \DateTimeZone('UTC'));
37+
yield (new MessageContext($trigger, $triggerAt)) => $messages[0];
38+
yield (new MessageContext($trigger, $triggerAt)) => $messages[1];
39+
});
3240
$transport = new SchedulerTransport($generator);
3341

3442
foreach ($transport->get() as $envelope) {

0 commit comments

Comments
 (0)