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

Commiteafba2e

Browse files
committed
Don't drop stamps when message validation fails
1 parent202199b commiteafba2e

File tree

8 files changed

+141
-14
lines changed

8 files changed

+141
-14
lines changed

‎src/Symfony/Component/Messenger/Exception/DelayedMessageHandlingException.php‎

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
*
2020
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
2121
*/
22-
class DelayedMessageHandlingExceptionextends RuntimeExceptionimplements WrappedExceptionsInterface
22+
class DelayedMessageHandlingExceptionextends RuntimeExceptionimplements WrappedExceptionsInterface, EnvelopeAwareExceptionInterface
2323
{
24+
use EnvelopeAwareExceptionTrait;
2425
use WrappedExceptionsTrait;
2526

2627
privatearray$exceptions;
27-
private ?Envelope$envelope;
2828

2929
publicfunction__construct(array$exceptions, ?Envelope$envelope =null)
3030
{
@@ -55,9 +55,4 @@ public function getExceptions(): array
5555

5656
return$this->exceptions;
5757
}
58-
59-
publicfunctiongetEnvelope(): ?Envelope
60-
{
61-
return$this->envelope;
62-
}
6358
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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\Messenger\Exception;
13+
14+
useSymfony\Component\Messenger\Envelope;
15+
16+
interface EnvelopeAwareExceptionInterface
17+
{
18+
publicfunctiongetEnvelope(): ?Envelope;
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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\Messenger\Exception;
13+
14+
useSymfony\Component\Messenger\Envelope;
15+
16+
trait EnvelopeAwareExceptionTrait
17+
{
18+
private ?Envelope$envelope =null;
19+
20+
publicfunctiongetEnvelope(): ?Envelope
21+
{
22+
return$this->envelope;
23+
}
24+
}

‎src/Symfony/Component/Messenger/Exception/HandlerFailedException.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
useSymfony\Component\Messenger\Envelope;
1515

16-
class HandlerFailedExceptionextends RuntimeExceptionimplements WrappedExceptionsInterface
16+
class HandlerFailedExceptionextends RuntimeExceptionimplements WrappedExceptionsInterface, EnvelopeAwareExceptionInterface
1717
{
1818
use WrappedExceptionsTrait;
1919

‎src/Symfony/Component/Messenger/Exception/ValidationFailedException.php‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,24 @@
1111

1212
namespaceSymfony\Component\Messenger\Exception;
1313

14+
useSymfony\Component\Messenger\Envelope;
1415
useSymfony\Component\Validator\ConstraintViolationListInterface;
1516

1617
/**
1718
* @author Tobias Nyholm <tobias.nyholm@gmail.com>
1819
*/
19-
class ValidationFailedExceptionextends RuntimeException
20+
class ValidationFailedExceptionextends RuntimeExceptionimplements EnvelopeAwareExceptionInterface
2021
{
22+
use EnvelopeAwareExceptionTrait;
23+
2124
privateConstraintViolationListInterface$violations;
2225
privateobject$violatingMessage;
2326

24-
publicfunction__construct(object$violatingMessage,ConstraintViolationListInterface$violations)
27+
publicfunction__construct(object$violatingMessage,ConstraintViolationListInterface$violations, ?Envelope$envelope =null)
2528
{
2629
$this->violatingMessage =$violatingMessage;
2730
$this->violations =$violations;
31+
$this->envelope =$envelope;
2832

2933
parent::__construct(sprintf('Message of type "%s" failed validation.',$this->violatingMessage::class));
3034
}

‎src/Symfony/Component/Messenger/Middleware/ValidationMiddleware.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
3939

4040
$violations =$this->validator->validate($message,null,$groups);
4141
if (\count($violations)) {
42-
thrownewValidationFailedException($message,$violations);
42+
thrownewValidationFailedException($message,$violations,$envelope);
4343
}
4444

4545
return$stack->next()->handle($envelope,$stack);

‎src/Symfony/Component/Messenger/Tests/FailureIntegrationTest.php‎

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
useSymfony\Component\Messenger\EventListener\StopWorkerOnMessageLimitListener;
2525
useSymfony\Component\Messenger\Exception\DelayedMessageHandlingException;
2626
useSymfony\Component\Messenger\Exception\HandlerFailedException;
27+
useSymfony\Component\Messenger\Exception\ValidationFailedException;
2728
useSymfony\Component\Messenger\Handler\HandlerDescriptor;
2829
useSymfony\Component\Messenger\Handler\HandlersLocator;
2930
useSymfony\Component\Messenger\MessageBus;
@@ -32,6 +33,7 @@
3233
useSymfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware;
3334
useSymfony\Component\Messenger\Middleware\HandleMessageMiddleware;
3435
useSymfony\Component\Messenger\Middleware\SendMessageMiddleware;
36+
useSymfony\Component\Messenger\Middleware\ValidationMiddleware;
3537
useSymfony\Component\Messenger\Retry\MultiplierRetryStrategy;
3638
useSymfony\Component\Messenger\Stamp\BusNameStamp;
3739
useSymfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp;
@@ -42,6 +44,9 @@
4244
useSymfony\Component\Messenger\Transport\Sender\SenderInterface;
4345
useSymfony\Component\Messenger\Transport\Sender\SendersLocator;
4446
useSymfony\Component\Messenger\Worker;
47+
useSymfony\Component\Validator\ConstraintViolation;
48+
useSymfony\Component\Validator\ConstraintViolationList;
49+
useSymfony\Component\Validator\Validator\ValidatorInterface;
4550

4651
class FailureIntegrationTestextends TestCase
4752
{
@@ -440,6 +445,87 @@ public function testStampsAddedByMiddlewaresDontDisappearWhenDelayedMessageFails
440445
$this->assertCount(1,$messagesWaiting);
441446
$this->assertSame('some.bus',$messagesWaiting[0]->last(BusNameStamp::class)?->getBusName());
442447
}
448+
449+
publicfunctiontestStampsAddedByMiddlewaresDontDisappearWhenValidationFails()
450+
{
451+
$transport1 =newDummyFailureTestSenderAndReceiver();
452+
453+
$transports = [
454+
'transport1' =>$transport1,
455+
];
456+
457+
$locator =$this->createMock(ContainerInterface::class);
458+
$locator->expects($this->any())
459+
->method('has')
460+
->willReturn(true);
461+
$locator->expects($this->any())
462+
->method('get')
463+
->willReturnCallback(fn ($transportName) =>$transports[$transportName]);
464+
$senderLocator =newSendersLocator([],$locator);
465+
466+
$retryStrategyLocator =$this->createMock(ContainerInterface::class);
467+
$retryStrategyLocator->expects($this->any())
468+
->method('has')
469+
->willReturn(true);
470+
$retryStrategyLocator->expects($this->any())
471+
->method('get')
472+
->willReturn(newMultiplierRetryStrategy(1));
473+
474+
$violationList =newConstraintViolationList([newConstraintViolation('validation failed',null, [],null,null,null)]);
475+
$validator =$this->createMock(ValidatorInterface::class);
476+
$validator->expects($this->once())->method('validate')->willReturn($violationList);
477+
478+
$middlewareStack =new \ArrayIterator([
479+
newAddBusNameStampMiddleware('some.bus'),
480+
newValidationMiddleware($validator),
481+
newSendMessageMiddleware($senderLocator),
482+
]);
483+
484+
$bus =newMessageBus($middlewareStack);
485+
486+
$transport1Handler =fn () =>$bus->dispatch(new \stdClass(), [newDispatchAfterCurrentBusStamp()]);
487+
488+
$handlerLocator =newHandlersLocator([
489+
DummyMessage::class => [newHandlerDescriptor($transport1Handler)],
490+
]);
491+
492+
$middlewareStack->append(newHandleMessageMiddleware($handlerLocator));
493+
494+
$dispatcher =newEventDispatcher();
495+
496+
$dispatcher->addSubscriber(newSendFailedMessageForRetryListener($locator,$retryStrategyLocator));
497+
$dispatcher->addSubscriber(newStopWorkerOnMessageLimitListener(1));
498+
499+
$runWorker =function (string$transportName)use ($transports,$bus,$dispatcher): ?\Throwable {
500+
$throwable =null;
501+
$failedListener =function (WorkerMessageFailedEvent$event)use (&$throwable) {
502+
$throwable =$event->getThrowable();
503+
};
504+
$dispatcher->addListener(WorkerMessageFailedEvent::class,$failedListener);
505+
506+
$worker =newWorker([$transportName =>$transports[$transportName]],$bus,$dispatcher);
507+
508+
$worker->run();
509+
510+
$dispatcher->removeListener(WorkerMessageFailedEvent::class,$failedListener);
511+
512+
return$throwable;
513+
};
514+
515+
// Simulate receive from external source
516+
$transport1->send(newEnvelope(newDummyMessage('API')));
517+
518+
// Receive the message from "transport1"
519+
$throwable =$runWorker('transport1');
520+
521+
$this->assertInstanceOf(ValidationFailedException::class,$throwable,$throwable->getMessage());
522+
523+
$messagesWaiting =$transport1->getMessagesWaitingToBeReceived();
524+
525+
// Stamps should not be dropped on message that's queued for retry
526+
$this->assertCount(1,$messagesWaiting);
527+
$this->assertSame('some.bus',$messagesWaiting[0]->last(BusNameStamp::class)?->getBusName());
528+
}
443529
}
444530

445531
class DummyFailureTestSenderAndReceiverimplements ReceiverInterface, SenderInterface

‎src/Symfony/Component/Messenger/Worker.php‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222
useSymfony\Component\Messenger\Event\WorkerRunningEvent;
2323
useSymfony\Component\Messenger\Event\WorkerStartedEvent;
2424
useSymfony\Component\Messenger\Event\WorkerStoppedEvent;
25-
useSymfony\Component\Messenger\Exception\DelayedMessageHandlingException;
26-
useSymfony\Component\Messenger\Exception\HandlerFailedException;
25+
useSymfony\Component\Messenger\Exception\EnvelopeAwareExceptionInterface;
2726
useSymfony\Component\Messenger\Exception\RejectRedeliveredMessageException;
2827
useSymfony\Component\Messenger\Exception\RuntimeException;
2928
useSymfony\Component\Messenger\Stamp\AckStamp;
@@ -189,7 +188,7 @@ private function ack(): bool
189188
$receiver->reject($envelope);
190189
}
191190

192-
if ($einstanceofHandlerFailedException || ($einstanceof DelayedMessageHandlingException&&null !==$e->getEnvelope())) {
191+
if ($einstanceofEnvelopeAwareExceptionInterface&&null !==$e->getEnvelope()) {
193192
$envelope =$e->getEnvelope();
194193
}
195194

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp