From 30a8558d82891dbcd167c747ce6ea38813a4ef64 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` --- CHANGELOG.md | 1 + Event/PostRunEvent.php | 6 +++++ .../DispatchSchedulerEventListener.php | 5 +++- Messenger/ServiceCallMessageHandler.php | 4 +-- Scheduler.php | 4 +-- .../DispatchSchedulerEventListenerTest.php | 26 ++++++++++--------- 6 files changed, 29 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fb6b75..20aa5b2 100644 --- a/CHANGELOG.md +++ b/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/Event/PostRunEvent.php b/Event/PostRunEvent.php index d5a7102..b7d7f93 100644 --- a/Event/PostRunEvent.php +++ b/Event/PostRunEvent.php @@ -20,6 +20,7 @@ class PostRunEvent private readonly ScheduleProviderInterface $schedule, private readonly MessageContext $messageContext, private readonly object $message, + private readonly mixed $result, ) { } @@ -37,4 +38,9 @@ class PostRunEvent { return $this->message; } + + public function getResult(): mixed + { + return $this->result; + } } diff --git a/EventListener/DispatchSchedulerEventListener.php b/EventListener/DispatchSchedulerEventListener.php index cdb0eba..e58c7c8 100644 --- a/EventListener/DispatchSchedulerEventListener.php +++ b/EventListener/DispatchSchedulerEventListener.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Envelope; 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 @@ class DispatchSchedulerEventListener implements EventSubscriberInterface 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/Messenger/ServiceCallMessageHandler.php b/Messenger/ServiceCallMessageHandler.php index ae990ef..aef7ac2 100644 --- a/Messenger/ServiceCallMessageHandler.php +++ b/Messenger/ServiceCallMessageHandler.php @@ -24,8 +24,8 @@ class ServiceCallMessageHandler { } - 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/Scheduler.php b/Scheduler.php index dd278cd..9e0a8d7 100644 --- a/Scheduler.php +++ b/Scheduler.php @@ -83,10 +83,10 @@ final class Scheduler } 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/Tests/EventListener/DispatchSchedulerEventListenerTest.php b/Tests/EventListener/DispatchSchedulerEventListenerTest.php index be012a0..a1b023d 100644 --- a/Tests/EventListener/DispatchSchedulerEventListenerTest.php +++ b/Tests/EventListener/DispatchSchedulerEventListenerTest.php @@ -18,6 +18,7 @@ use Symfony\Component\Messenger\Envelope; 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 @@ class DispatchSchedulerEventListenerTest extends TestCase $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 @@ class DispatchSchedulerEventListenerTest extends TestCase $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; } }