mirror of
https://github.com/symfony/scheduler.git
synced 2026-03-24 00:02:18 +01:00
[Scheduler] Add MessageHandler result to the PostRunEvent
This commit is contained in:
committed by
Fabien Potencier
parent
17732a48ee
commit
30a8558d82
@@ -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
|
||||
---
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user