[Scheduler] Add MessageHandler result to the PostRunEvent

This commit is contained in:
Barthold Bos
2024-10-11 20:26:33 +02:00
committed by Fabien Potencier
parent 17732a48ee
commit 30a8558d82
6 changed files with 29 additions and 17 deletions

View File

@@ -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
---

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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());
}
}

View File

@@ -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);

View File

@@ -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;
}
}