From 306eeb6dd3384d193acf2c97ef78449bfe6d778b Mon Sep 17 00:00:00 2001 From: Barthold Bos Date: Fri, 11 Oct 2024 20:26:33 +0200 Subject: [PATCH] [Scheduler] Add MessageHandler result to the `PostRunEvent` --- .../Handler/RedispatchMessageHandler.php | 7 +++-- src/Symfony/Component/Scheduler/CHANGELOG.md | 1 + .../Scheduler/Event/PostRunEvent.php | 6 +++++ .../DispatchSchedulerEventListener.php | 5 +++- .../Messenger/ServiceCallMessageHandler.php | 4 +-- src/Symfony/Component/Scheduler/Scheduler.php | 4 +-- .../DispatchSchedulerEventListenerTest.php | 26 ++++++++++--------- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/Symfony/Component/Messenger/Handler/RedispatchMessageHandler.php b/src/Symfony/Component/Messenger/Handler/RedispatchMessageHandler.php index cb2848c92a561..0a5769e875796 100644 --- a/src/Symfony/Component/Messenger/Handler/RedispatchMessageHandler.php +++ b/src/Symfony/Component/Messenger/Handler/RedispatchMessageHandler.php @@ -13,6 +13,7 @@ use Symfony\Component\Messenger\Message\RedispatchMessage; use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Messenger\Stamp\TransportNamesStamp; final class RedispatchMessageHandler @@ -22,8 +23,10 @@ public function __construct( ) { } - public function __invoke(RedispatchMessage $message): void + public function __invoke(RedispatchMessage $message): mixed { - $this->bus->dispatch($message->envelope, [new TransportNamesStamp($message->transportNames)]); + $envelope = $this->bus->dispatch($message->envelope, [new TransportNamesStamp($message->transportNames)]); + + return $envelope->last(HandledStamp::class)?->getResult(); } } diff --git a/src/Symfony/Component/Scheduler/CHANGELOG.md b/src/Symfony/Component/Scheduler/CHANGELOG.md index 2fb6b75be694d..20aa5b2d29050 100644 --- a/src/Symfony/Component/Scheduler/CHANGELOG.md +++ b/src/Symfony/Component/Scheduler/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG --- * Add capability to skip missed periodic tasks, only the last schedule will be called + * Add MessageHandler returned result to `PostRunEvent` 6.4 --- diff --git a/src/Symfony/Component/Scheduler/Event/PostRunEvent.php b/src/Symfony/Component/Scheduler/Event/PostRunEvent.php index d5a71021edcac..b7d7f93443a48 100644 --- a/src/Symfony/Component/Scheduler/Event/PostRunEvent.php +++ b/src/Symfony/Component/Scheduler/Event/PostRunEvent.php @@ -20,6 +20,7 @@ public function __construct( private readonly ScheduleProviderInterface $schedule, private readonly MessageContext $messageContext, private readonly object $message, + private readonly mixed $result, ) { } @@ -37,4 +38,9 @@ public function getMessage(): object { return $this->message; } + + public function getResult(): mixed + { + return $this->result; + } } diff --git a/src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php b/src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php index cdb0ebae738b7..e58c7c8c5c863 100644 --- a/src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php +++ b/src/Symfony/Component/Scheduler/EventListener/DispatchSchedulerEventListener.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Messenger\Stamp\StampInterface; use Symfony\Component\Scheduler\Event\FailureEvent; use Symfony\Component\Scheduler\Event\PostRunEvent; @@ -40,7 +41,9 @@ public function onMessageHandled(WorkerMessageHandledEvent $event): void return; } - $this->eventDispatcher->dispatch(new PostRunEvent($this->scheduleProviderLocator->get($scheduledStamp->messageContext->name), $scheduledStamp->messageContext, $envelope->getMessage())); + $result = $envelope->last(HandledStamp::class)?->getResult(); + + $this->eventDispatcher->dispatch(new PostRunEvent($this->scheduleProviderLocator->get($scheduledStamp->messageContext->name), $scheduledStamp->messageContext, $envelope->getMessage(), $result)); } public function onMessageReceived(WorkerMessageReceivedEvent $event): void diff --git a/src/Symfony/Component/Scheduler/Messenger/ServiceCallMessageHandler.php b/src/Symfony/Component/Scheduler/Messenger/ServiceCallMessageHandler.php index ae990efc7dc92..aef7ac21ea690 100644 --- a/src/Symfony/Component/Scheduler/Messenger/ServiceCallMessageHandler.php +++ b/src/Symfony/Component/Scheduler/Messenger/ServiceCallMessageHandler.php @@ -24,8 +24,8 @@ public function __construct(private readonly ContainerInterface $serviceLocator) { } - public function __invoke(ServiceCallMessage $message): void + public function __invoke(ServiceCallMessage $message): mixed { - $this->serviceLocator->get($message->getServiceId())->{$message->getMethod()}(...$message->getArguments()); + return $this->serviceLocator->get($message->getServiceId())->{$message->getMethod()}(...$message->getArguments()); } } diff --git a/src/Symfony/Component/Scheduler/Scheduler.php b/src/Symfony/Component/Scheduler/Scheduler.php index dd278cd1caf99..9e0a8d76e5f78 100644 --- a/src/Symfony/Component/Scheduler/Scheduler.php +++ b/src/Symfony/Component/Scheduler/Scheduler.php @@ -83,10 +83,10 @@ public function run(array $options = []): void } try { - $this->handlers[$message::class]($message); + $result = $this->handlers[$message::class]($message); $ran = true; - $this->dispatcher->dispatch(new PostRunEvent($generator->getSchedule(), $context, $message)); + $this->dispatcher->dispatch(new PostRunEvent($generator->getSchedule(), $context, $message, $result)); } catch (\Throwable $error) { $failureEvent = new FailureEvent($generator->getSchedule(), $context, $message, $error); $this->dispatcher->dispatch($failureEvent); diff --git a/src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php b/src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php index be012a027b88e..a1b023d1de326 100644 --- a/src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php +++ b/src/Symfony/Component/Scheduler/Tests/EventListener/DispatchSchedulerEventListenerTest.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent; +use Symfony\Component\Messenger\Stamp\HandledStamp; use Symfony\Component\Scheduler\Event\FailureEvent; use Symfony\Component\Scheduler\Event\PostRunEvent; use Symfony\Component\Scheduler\Event\PreRunEvent; @@ -44,8 +45,8 @@ public function testDispatchSchedulerEvents() $listener = new DispatchSchedulerEventListener($scheduleProviderLocator, $eventDispatcher = new EventDispatcher()); $workerReceivedEvent = new WorkerMessageReceivedEvent($envelope, 'default'); - $workerHandledEvent = new WorkerMessageHandledEvent($envelope, 'default'); - $workerFailedEvent = new WorkerMessageFailedEvent($envelope, 'default', new \Exception()); + $workerHandledEvent = new WorkerMessageHandledEvent($envelope->with(new HandledStamp('result', 'handlerName')), 'default'); + $workerFailedEvent = new WorkerMessageFailedEvent($envelope, 'default', new \Exception('failed')); $secondListener = new TestEventListener(); $eventDispatcher->addListener(PreRunEvent::class, [$secondListener, 'preRun']); @@ -55,33 +56,34 @@ public function testDispatchSchedulerEvents() $listener->onMessageHandled($workerHandledEvent); $listener->onMessageFailed($workerFailedEvent); - $this->assertTrue($secondListener->preInvoked); - $this->assertTrue($secondListener->postInvoked); - $this->assertTrue($secondListener->failureInvoked); + $this->assertInstanceOf(PreRunEvent::class, $secondListener->preRunEvent); + $this->assertSame('result', $secondListener->postRunEvent->getResult()); + $this->assertInstanceOf(PostRunEvent::class, $secondListener->postRunEvent); + $this->assertInstanceOf(FailureEvent::class, $secondListener->failureEvent); + $this->assertEquals(new \Exception('failed'), $secondListener->failureEvent->getError()); } } class TestEventListener { - public string $name; - public bool $preInvoked = false; - public bool $postInvoked = false; - public bool $failureInvoked = false; + public ?PreRunEvent $preRunEvent = null; + public ?PostRunEvent $postRunEvent = null; + public ?FailureEvent $failureEvent = null; /* Listener methods */ public function preRun($e) { - $this->preInvoked = true; + $this->preRunEvent = $e; } public function postRun($e) { - $this->postInvoked = true; + $this->postRunEvent = $e; } public function onFailure($e) { - $this->failureInvoked = true; + $this->failureEvent = $e; } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy