8000 feature #58546 [Scheduler] Add MessageHandler result to the `PostRunE… · symfony/symfony@201747b · GitHub
[go: up one dir, main page]

Skip to content

Commit 201747b

Browse files
committed
feature #58546 [Scheduler] Add MessageHandler result to the PostRunEvent (bartholdbos)
This PR was squashed before being merged into the 7.3 branch. Discussion ---------- [Scheduler] Add MessageHandler result to the `PostRunEvent` | Q | A | ------------- | --- | Branch? | 7.3 | Bug fix? | no | New feature? | yes | Deprecations? | no | Issues | | License | MIT This PR will add the result of a MessageHandler to the PostRunEvent of the Scheduler Component. This can be used for example for retrieving the output of a RunCommandMessage scheduled by the scheduler component. ``` <?php namespace App\Service; use Symfony\Component\Console\Messenger\RunCommandMessage; use Symfony\Component\Scheduler\Attribute\AsSchedule; use Symfony\Component\Scheduler\RecurringMessage; use Symfony\Component\Scheduler\Schedule; use Symfony\Component\Scheduler\ScheduleProviderInterface; #[AsSchedule] class ScheduleProvider implements ScheduleProviderInterface { public function getSchedule(): Schedule { $schedule = new Schedule(); $schedule->add(RecurringMessage::cron('* * * * *', new RunCommandMessage('about'))); return $schedule; } } ``` ``` <?php namespace App\EventListener; use Symfony\Component\Console\Messenger\RunCommandContext; use Symfony\Component\EventDispatcher\Attribute\AsEventListener; use Symfony\Component\Scheduler\Event\PostRunEvent; #[AsEventListener(event: PostRunEvent::class, method: 'onMessage')] class SchedulerListener { public function onMessage(PostRunEvent $event): void { $result = $event->getResult(); if ($result instanceof RunCommandContext) { echo $result->output; //Log or store output somewhere } } } ``` <!-- Replace this notice by a description of your feature/bugfix. This will help reviewers and should be a good start for the documentation. Additionally (see https://symfony.com/releases): - Always add tests and ensure they pass. - Bug fixes must be submitted against the lowest maintained branch where they apply (lowest branches are regularly merged to upper ones so they get the fixes too). - Features and deprecations must be submitted against the latest branch. - For new features, provide some code snippets to help understand usage. - Changelog entry should follow https://symfony.com/doc/current/contributing/code/conventions.html#writing-a-changelog-entry - Never break backward compatibility (see https://symfony.com/bc). --> Commits ------- 306eeb6 [Scheduler] Add MessageHandler result to the `PostRunEvent`
2 parents b27f2ec + 306eeb6 commit 201747b

File tree

7 files changed

+34
-19
lines changed

7 files changed

+34
-19
lines changed

src/Symfony/Component/Messenger/Handler/RedispatchMessageHandler.php

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

1414
use Symfony\Component\Messenger\Message\RedispatchMessage;
1515
use Symfony\Component\Messenger\MessageBusInterface;
16+
use Symfony\Component\Messenger\Stamp\HandledStamp;
1617
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
1718

1819
final class RedispatchMessageHandler
@@ -22,8 +23,10 @@ public function __construct(
2223
) {
2324
}
2425

25-
public function __invoke(RedispatchMessage $message): void
26+
public function __invoke(RedispatchMessage $message): mixed
2627
{
27-
$this->bus->dispatch($message->envelope, [new TransportNamesStamp($message->transportNames)]);
28+
$envelope = $this->bus->dispatch($message->envelope, [new TransportNamesStamp($message->transportNames)]);
29+
30+
return $envelope->last(HandledStamp::class)?->getResult();
2831
}
2932
}

src/Symfony/Component/Scheduler/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ CHANGELOG
1010
---
1111

1212
* Add capability to skip missed periodic tasks, only the last schedule will be called
13+
* Add MessageHandler returned result to `PostRunEvent`
1314

1415
6.4
1516
---

src/Symfony/Component/Scheduler/Event/PostRunEvent.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public function __construct(
2020
private readonly ScheduleProviderInterface $schedule,
2121
private readonly MessageContext $messageContext,
2222
private readonly object $message,
23+
private readonly mixed $result,
2324
) {
2425
}
2526

@@ -37,4 +38,9 @@ public function getMessage(): object
3738
{
3839
return $this->message;
3940
}
41+
42+
public function getResult(): mixed
43+
{
44+
return $this->result;
45+
}
4046
}

src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
1919
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
2020
use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
21+
use Symfony\Component\Messenger\Stamp\HandledStamp;
2122
use Symfony\Component\Messenger\Stamp\StampInterface;
2223
use Symfony\Component\Scheduler\Event\FailureEvent;
2324
use Symfony\Component\Scheduler\Event\PostRunEvent;
@@ -40,7 +41,9 @@ public function onMessageHandled(WorkerMessageHandledEvent $event): void
4041
return;
4142
}
4243

43-
$this->eventDispatcher->dispatch(new PostRunEvent($this->scheduleProviderLocator->get($scheduledStamp->messageContext->name), $scheduledStamp->messageContext, $envelope->getMessage()));
44+
$result = $envelope->last(HandledStamp::class)?->getResult();
45+
46+
$this->eventDispatcher->dispatch(new PostRunEvent($this->scheduleProviderLocator->get($scheduledStamp->messageContext->name), $scheduledStamp->messageContext, $envelope->getMessage(), $result));
4447
}
4548

4649
public function onMessageReceived(WorkerMessageReceivedEvent $event): void

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ public function __construct(private readonly ContainerInterface $serviceLocator)
2424
{
2525
}
2626

27-
public function __invoke(ServiceCallMessage $message): void
27+
public function __invoke(ServiceCallMessage $message): mixed
2828
{
29-
$this->serviceLocator->get($message->getServiceId())->{$message->getMethod()}(...$message->getArguments());
29+
return $this->serviceLocator->get($message->getServiceId())->{$message->getMethod()}(...$message->getArguments());
3030
}
3131
}

src/Symfony/Component/Scheduler/Scheduler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ public function run(array $options = []): void
8383
}
8484

8585
try {
86-
$this->handlers[$message::class]($message);
86+
$result = $this->handlers[$message::class]($message);
8787
$ran = true;
8888

89-
$this->dispatcher->dispatch(new PostRunEvent($generator->getSchedule(), $context, $message));
89+
$this->dispatcher->dispatch(new PostRunEvent($generator->getSchedule(), $context, $message, $result));
9090
} catch (\Throwable $error) {
9191
$failureEvent = new FailureEvent($generator->getSchedule(), $context, $message, $error);
9292
$this->dispatcher->dispatch($failureEvent);

src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
1919
use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent;
2020
use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
21+
use Symfony\Component\Messenger\Stamp\HandledStamp;
2122
use Symfony\Component\Scheduler\Event\FailureEvent;
2223
use Symfony\Component\Scheduler\Event\PostRunEvent;
2324
use Symfony\Component\Scheduler\Event\PreRunEvent;
@@ -44,8 +45,8 @@ public function testDispatchSchedulerEvents()
4445

4546
$listener = new DispatchSchedulerEventListener($scheduleProviderLocator, $eventDispatcher = new EventDispatcher());
4647
$workerReceivedEvent = new WorkerMessageReceivedEvent($envelope, 'default');
47-
$workerHandledEvent = new WorkerMessageHandledEvent($envelope, 'default');
48-
$workerFailedEvent = new WorkerMessageFailedEvent($envelope, 'default', new \Exception());
48+
$workerHandledEvent = new WorkerMessageHandledEvent($envelope->with(new HandledStamp('result', 'handlerName')), 'default');
49+
$workerFailedEvent = new WorkerMessageFailedEvent($envelope, 'default', new \Exception('failed'));
4950
$secondListener = new TestEventListener();
5051

5152
$eventDispatcher->addListener(PreRunEvent::class, [$secondListener, 'preRun']);
@@ -55,33 +56,34 @@ public function testDispatchSchedulerEvents()
5556
$listener->onMessageHandled($workerHandledEvent);
5657
$listener->onMessageFailed($workerFailedEvent);
5758

58-
$this->assertTrue($secondListener->preInvoked);
59-
$this->assertTrue($secondListener->postInvoked);
60-
$this->assertTrue($secondListener->failureInvoked);
59+
$this->assertInstanceOf(PreRunEvent::class, $secondListener->preRunEvent);
60+
$this->assertSame('result', $secondListener->postRunEvent->getResult());
61+
$this->assertInstanceOf(PostRunEvent::class, $secondListener->postRunEvent);
62+
$this->assertInstanceOf(FailureEvent::class, $secondListener->failureEvent);
63+
$this->assertEquals(new \Exception('failed'), $secondListener->failureEvent->getError());
6164
}
6265
}
6366

6467
class TestEventListener
6568
{
66-
public string $name;
67-
public bool $preInvoked = false;
68-
public bool $postInvoked = false;
69-
public bool $failureInvoked = false;
69+
public ?PreRunEvent $preRunEvent = null;
70+
public ?PostRunEvent $postRunEvent = null;
71+
public ?FailureEvent $failureEvent = null;
7072

7173
/* Listener methods */
7274

7375
public function preRun($e)
7476
{
75-
$this->preInvoked = true;
77+
$this->preRunEvent = $e;
7678
}
7779

7880
public function postRun($e)
7981
{
80-
$this->postInvoked = true;
82+
$this->postRunEvent = $e;
8183
}
8284

8385
public function onFailure($e)
8486
{
85-
$this->failureInvoked = true;
87+
$this->failureEvent = $e;
8688
}
8789
}

0 commit comments

Comments
 (0)
0