Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitdd70b10

Browse files
committed
[Scheduler] add failure event
1 parent934aea0 commitdd70b10

File tree

6 files changed

+101
-15
lines changed

6 files changed

+101
-15
lines changed

‎src/Symfony/Component/Scheduler/CHANGELOG.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ CHANGELOG
1515
* Add`MessageProviderInterface` to trigger unique messages at runtime
1616
* Add`PreRunEvent` and`PostRunEvent` events
1717
* Add`DispatchSchedulerEventListener`
18+
* Add`FailureEvent` event
1819

1920
6.3
2021
---
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Component\Scheduler\Event;
13+
14+
useSymfony\Component\Scheduler\Generator\MessageContext;
15+
useSymfony\Component\Scheduler\ScheduleProviderInterface;
16+
17+
class FailureEvent
18+
{
19+
publicfunction__construct(
20+
privatereadonlyScheduleProviderInterface$schedule,
21+
privatereadonlyMessageContext$messageContext,
22+
privatereadonlyobject$message,
23+
privatereadonly\Throwable$error,
24+
) {
25+
}
26+
27+
publicfunctiongetMessageContext():MessageContext
28+
{
29+
return$this->messageContext;
30+
}
31+
32+
publicfunctiongetSchedule():ScheduleProviderInterface
33+
{
34+
return$this->schedule;
35+
}
36+
37+
publicfunctiongetMessage():object
38+
{
39+
return$this->message;
40+
}
41+
42+
publicfunctiongetError():\Throwable
43+
{
44+
return$this->error;
45+
}
46+
}

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

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,12 @@
1414
usePsr\Container\ContainerInterface;
1515
usePsr\EventDispatcher\EventDispatcherInterface;
1616
useSymfony\Component\EventDispatcher\EventSubscriberInterface;
17+
useSymfony\Component\Messenger\Envelope;
18+
useSymfony\Component\Messenger\Event\WorkerMessageFailedEvent;
1719
useSymfony\Component\Messenger\Event\WorkerMessageHandledEvent;
1820
useSymfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
21+
useSymfony\Component\Messenger\Stamp\StampInterface;
22+
useSymfony\Component\Scheduler\Event\FailureEvent;
1923
useSymfony\Component\Scheduler\Event\PostRunEvent;
2024
useSymfony\Component\Scheduler\Event\PreRunEvent;
2125
useSymfony\Component\Scheduler\Messenger\ScheduledStamp;
@@ -31,11 +35,8 @@ public function __construct(
3135
publicfunctiononMessageHandled(WorkerMessageHandledEvent$event):void
3236
{
3337
$envelope =$event->getEnvelope();
34-
if (!$scheduledStamp =$envelope->last(ScheduledStamp::class)) {
35-
return;
36-
}
3738

38-
if (!$this->scheduleProviderLocator->has($scheduledStamp->messageContext->name)) {
39+
if (!$scheduledStamp =$this->getScheduledStamp($envelope)) {
3940
return;
4041
}
4142

@@ -46,11 +47,7 @@ public function onMessageReceived(WorkerMessageReceivedEvent $event): void
4647
{
4748
$envelope =$event->getEnvelope();
4849

49-
if (!$scheduledStamp =$envelope->last(ScheduledStamp::class)) {
50-
return;
51-
}
52-
53-
if (!$this->scheduleProviderLocator->has($scheduledStamp->messageContext->name)) {
50+
if (!$scheduledStamp =$this->getScheduledStamp($envelope)) {
5451
return;
5552
}
5653

@@ -63,11 +60,36 @@ public function onMessageReceived(WorkerMessageReceivedEvent $event): void
6360
}
6461
}
6562

63+
publicfunctiononMessageFailed(WorkerMessageFailedEvent$event):void
64+
{
65+
$envelope =$event->getEnvelope();
66+
67+
if (!$scheduledStamp =$this->getScheduledStamp($envelope)) {
68+
return;
69+
}
70+
71+
$this->eventDispatcher->dispatch(newFailureEvent($this->scheduleProviderLocator->get($scheduledStamp->messageContext->name),$scheduledStamp->messageContext,$envelope->getMessage(),$event->getThrowable()));
72+
}
73+
74+
privatefunctiongetScheduledStamp(Envelope$envelope): ?StampInterface
75+
{
76+
if (!$scheduledStamp =$envelope->last(ScheduledStamp::class)) {
77+
returnnull;
78+
}
79+
80+
if (!$this->scheduleProviderLocator->has($scheduledStamp->messageContext->name)) {
81+
returnnull;
82+
}
83+
84+
return$scheduledStamp;
85+
}
86+
6687
publicstaticfunctiongetSubscribedEvents():array
6788
{
6889
return [
6990
WorkerMessageReceivedEvent::class => ['onMessageReceived'],
7091
WorkerMessageHandledEvent::class => ['onMessageHandled'],
92+
WorkerMessageFailedEvent::class => ['onMessageFailed'],
7193
];
7294
}
7395
}

‎src/Symfony/Component/Scheduler/Schedule.php‎

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

1414
useSymfony\Component\EventDispatcher\EventDispatcherInterface;
1515
useSymfony\Component\Lock\LockInterface;
16+
useSymfony\Component\Scheduler\Event\FailureEvent;
1617
useSymfony\Component\Scheduler\Event\PostRunEvent;
1718
useSymfony\Component\Scheduler\Event\PreRunEvent;
1819
useSymfony\Component\Scheduler\Exception\LogicException;
@@ -152,6 +153,13 @@ public function after(callable $listener, int $priority = 0): static
152153
return$this;
153154
}
154155

156+
publicfunctiononFailure(callable$listener,int$priority =0):static
157+
{
158+
$this->dispatcher->addListener(FailureEvent::class,$listener,$priority);
159+
160+
return$this;
161+
}
162+
155163
publicfunctionshouldRestart():bool
156164
{
157165
return$this->shouldRestart;

‎src/Symfony/Component/Scheduler/Scheduler.php‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
usePsr\EventDispatcher\EventDispatcherInterface;
1515
useSymfony\Component\Clock\Clock;
1616
useSymfony\Component\Clock\ClockInterface;
17+
useSymfony\Component\Scheduler\Event\FailureEvent;
1718
useSymfony\Component\Scheduler\Event\PostRunEvent;
1819
useSymfony\Component\Scheduler\Event\PreRunEvent;
1920
useSymfony\Component\Scheduler\Generator\MessageGenerator;
@@ -81,10 +82,14 @@ public function run(array $options = []): void
8182
continue;
8283
}
8384

84-
$this->handlers[$message::class]($message);
85-
$ran =true;
85+
try {
86+
$this->handlers[$message::class]($message);
87+
$ran =true;
8688

87-
$this->dispatcher->dispatch(newPostRunEvent($generator->getSchedule(),$context,$message));
89+
$this->dispatcher->dispatch(newPostRunEvent($generator->getSchedule(),$context,$message));
90+
}catch (\Throwable$error) {
91+
$this->dispatcher->dispatch(newFailureEvent($generator->getSchedule(),$context,$message,$error));
92+
}
8893
}
8994
}
9095

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
usePsr\Container\ContainerInterface;
1616
useSymfony\Component\EventDispatcher\EventDispatcher;
1717
useSymfony\Component\Messenger\Envelope;
18+
useSymfony\Component\Messenger\Event\WorkerMessageHandledEvent;
1819
useSymfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
20+
useSymfony\Component\Scheduler\Event\PostRunEvent;
1921
useSymfony\Component\Scheduler\Event\PreRunEvent;
2022
useSymfony\Component\Scheduler\EventListener\DispatchSchedulerEventListener;
2123
useSymfony\Component\Scheduler\Generator\MessageContext;
@@ -33,20 +35,22 @@ public function testDispatchSchedulerEvents()
3335

3436
$schedulerProvider =newSomeScheduleProvider([$defaultRecurringMessage]);
3537
$scheduleProviderLocator =$this->createMock(ContainerInterface::class);
36-
$scheduleProviderLocator->expects($this->once())->method('has')->willReturn(true);
37-
$scheduleProviderLocator->expects($this->once())->method('get')->willReturn($schedulerProvider);
38+
$scheduleProviderLocator->expects($this->any())->method('has')->willReturn(true);
39+
$scheduleProviderLocator->expects($this->any())->method('get')->willReturn($schedulerProvider);
3840

3941
$context =newMessageContext('default','default',$trigger,$this->createMock(\DateTimeImmutable::class));
4042
$envelope = (newEnvelope(new \stdClass()))->with(newScheduledStamp($context));
4143

4244
/** @var ContainerInterface $scheduleProviderLocator */
4345
$listener =newDispatchSchedulerEventListener($scheduleProviderLocator,$eventDispatcher =newEventDispatcher());
4446
$workerReceivedEvent =newWorkerMessageReceivedEvent($envelope,'default');
47+
$workerHandledEvent =newWorkerMessageHandledEvent($envelope,'default');
4548
$secondListener =newTestEventListener();
4649

4750
$eventDispatcher->addListener(PreRunEvent::class, [$secondListener,'preRun']);
48-
$eventDispatcher->addListener(PreRunEvent::class, [$secondListener,'postRun']);
51+
$eventDispatcher->addListener(PostRunEvent::class, [$secondListener,'postRun']);
4952
$listener->onMessageReceived($workerReceivedEvent);
53+
$listener->onMessageHandled($workerHandledEvent);
5054

5155
$this->assertTrue($secondListener->preInvoked);
5256
$this->assertTrue($secondListener->postInvoked);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp