From e6e4cde5fcb176de989a7526088ae9fc75bd1312 Mon Sep 17 00:00:00 2001 From: Jonas Elfering Date: Tue, 29 Jan 2019 14:21:02 +0100 Subject: [PATCH 1/2] Ensure message is handled only once per handler Add check to ensure that a message is only handled once per handler Add try...catch to run all handlers before throwing exception --- .../ChainedHandlerFailedException.php | 61 +++++++++++++++++ .../Middleware/HandleMessageMiddleware.php | 33 +++++++++- .../Messenger/Stamp/HandledStamp.php | 21 +++--- .../MessageHandlerFailingFirstTimes.php | 39 +++++++++++ .../HandleMessageMiddlewareTest.php | 38 +++++++++-- .../Messenger/Tests/RetryIntegrationTest.php | 65 +++++++++++++++++++ src/Symfony/Component/Messenger/Worker.php | 5 ++ 7 files changed, 246 insertions(+), 16 deletions(-) create mode 100644 src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php create mode 100644 src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php create mode 100644 src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php diff --git a/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php b/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php new file mode 100644 index 0000000000000..e8f360dd85d7a --- /dev/null +++ b/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace Symfony\Component\Messenger\Exception; + +use Symfony\Component\Messenger\Envelope; + +class ChainedHandlerFailedException extends \RuntimeException implements ExceptionInterface +{ + /** + * @var \Throwable[] + */ + private $nested; + + /** + * @var Envelope + */ + private $envelope; + + public function __construct(Envelope $envelope, \Throwable ...$nested) + { + parent::__construct($this->constructMessage($nested)); + $this->envelope = $envelope; + $this->nested = $nested; + } + + public function getEnvelope(): Envelope + { + return $this->envelope; + } + + /** + * @return \Throwable[] + */ + public function getNestedExceptions(): array + { + return $this->nested; + } + + /** + * @param \Throwable[] $nested + * + * @return string + */ + private function constructMessage(array $nested): string + { + return 1 === \count($nested) ? + $nested[0]->getMessage() : + sprintf('%d MessageHandler failed. First one failed with Message: %s', \count($nested), $nested[0]->getMessage()); + } +} diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index ed47ac6389128..c0662ec2915c9 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -14,6 +14,7 @@ use Psr\Log\LoggerAwareTrait; use Psr\Log\NullLogger; use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; use Symfony\Component\Messenger\Exception\NoHandlerForMessageException; use Symfony\Component\Messenger\Handler\HandlersLocatorInterface; use Symfony\Component\Messenger\Stamp\HandledStamp; @@ -52,10 +53,21 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope 'class' => \get_class($message), ]; + $exceptions = []; foreach ($this->handlersLocator->getHandlers($envelope) as $alias => $handler) { - $handledStamp = HandledStamp::fromCallable($handler, $handler($message), \is_string($alias) ? $alias : null); - $envelope = $envelope->with($handledStamp); - $this->logger->info('Message "{class}" handled by "{handler}"', $context + ['handler' => $handledStamp->getCallableName()]); + $alias = \is_string($alias) ? $alias : null; + + if ($this->messageHasAlreadyBeenHandled($envelope, $handler, $alias)) { + continue; + } + + try { + $handledStamp = HandledStamp::fromCallable($handler, $handler($message), $alias); + $envelope = $envelope->with($handledStamp); + $this->logger->info('Message "{class}" handled by "{handler}"', $context + ['handler' => $handledStamp->getCallableName()]); + } catch (\Throwable $e) { + $exceptions[] = $e; + } } if (null === $handler) { @@ -66,6 +78,21 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope $this->logger->info('No handler for message "{class}"', $context); } + if (\count($exceptions)) { + throw new ChainedHandlerFailedException($envelope, ...$exceptions); + } + return $stack->next()->handle($envelope, $stack); } + + private function messageHasAlreadyBeenHandled(Envelope $envelope, callable $handler, ?string $alias): bool + { + $some = array_filter($envelope + ->all(HandledStamp::class), function (HandledStamp $stamp) use ($handler, $alias) { + return $stamp->getCallableName() === HandledStamp::getNameFromCallable($handler) && + $stamp->getHandlerAlias() === $alias; + }); + + return \count($some) > 0; + } } diff --git a/src/Symfony/Component/Messenger/Stamp/HandledStamp.php b/src/Symfony/Component/Messenger/Stamp/HandledStamp.php index 0cd480765ecb8..491aa64472ebd 100644 --- a/src/Symfony/Component/Messenger/Stamp/HandledStamp.php +++ b/src/Symfony/Component/Messenger/Stamp/HandledStamp.php @@ -40,33 +40,38 @@ public function __construct($result, string $callableName, string $handlerAlias /** * @param mixed $result The returned value of the message handler */ - public static function fromCallable(callable $handler, $result, string $handlerAlias = null): self + public static function fromCallable(callable $handler, $result, ?string $handlerAlias = null): self + { + return new self($result, self::getNameFromCallable($handler), $handlerAlias); + } + + public static function getNameFromCallable(callable $handler): string { if (\is_array($handler)) { if (\is_object($handler[0])) { - return new self($result, \get_class($handler[0]).'::'.$handler[1], $handlerAlias); + return \get_class($handler[0]).'::'.$handler[1]; } - return new self($result, $handler[0].'::'.$handler[1], $handlerAlias); + return $handler[0].'::'.$handler[1]; } if (\is_string($handler)) { - return new self($result, $handler, $handlerAlias); + return $handler; } if ($handler instanceof \Closure) { $r = new \ReflectionFunction($handler); if (false !== strpos($r->name, '{closure}')) { - return new self($result, 'Closure', $handlerAlias); + return 'Closure'; } if ($class = $r->getClosureScopeClass()) { - return new self($result, $class->name.'::'.$r->name, $handlerAlias); + return $class->name.'::'.$r->name; } - return new self($result, $r->name, $handlerAlias); + return $r->name; } - return new self($result, \get_class($handler).'::__invoke', $handlerAlias); + return \get_class($handler).'::__invoke'; } /** diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php b/src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php new file mode 100644 index 0000000000000..d315cb0836206 --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Tests\Fixtures; + +class MessageHandlerFailingFirstTimes +{ + private $remainingFailures; + + private $called = 0; + + public function __construct(int $throwExceptionOnFirstTries = 0) + { + $this->remainingFailures = $throwExceptionOnFirstTries; + } + + public function __invoke(DummyMessage $message) + { + if ($this->remainingFailures > 0) { + --$this->remainingFailures; + throw new \Exception('Handler should throw Exception.'); + } + + ++$this->called; + } + + public function getTimesCalledWithoutThrowing(): int + { + return $this->called; + } +} diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php index 953124fb9b77d..20b8667f4ed5c 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Tests\Middleware; use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Middleware\StackMiddleware; @@ -40,7 +41,7 @@ public function testItCallsTheHandlerAndNextMiddleware() /** * @dataProvider itAddsHandledStampsProvider */ - public function testItAddsHandledStamps(array $handlers, array $expectedStamps) + public function testItAddsHandledStamps(array $handlers, array $expectedStamps, bool $nextIsCalled) { $message = new DummyMessage('Hey'); $envelope = new Envelope($message); @@ -49,7 +50,11 @@ public function testItAddsHandledStamps(array $handlers, array $expectedStamps) DummyMessage::class => $handlers, ])); - $envelope = $middleware->handle($envelope, $this->getStackMock()); + try { + $envelope = $middleware->handle($envelope, $this->getStackMock($nextIsCalled)); + } catch (ChainedHandlerFailedException $e) { + $envelope = $e->getEnvelope(); + } $this->assertEquals($expectedStamps, $envelope->all(HandledStamp::class)); } @@ -64,17 +69,22 @@ public function itAddsHandledStampsProvider() $second->method('__invoke')->willReturn(null); $secondClass = \get_class($second); + $failing = $this->createPartialMock(\stdClass::class, ['__invoke']); + $failing->method('__invoke')->will($this->throwException(new \Exception('handler failed.'))); + yield 'A stamp is added' => [ [$first], [new HandledStamp('first result', $firstClass.'::__invoke')], + true, ]; yield 'A stamp is added per handler' => [ - [$first, $second], + ['first' => $first, 'second' => $second], [ - new HandledStamp('first result', $firstClass.'::__invoke'), - new HandledStamp(null, $secondClass.'::__invoke'), + new HandledStamp('first result', $firstClass.'::__invoke', 'first'), + new HandledStamp(null, $secondClass.'::__invoke', 'second'), ], + true, ]; yield 'Yielded locator alias is used' => [ @@ -83,6 +93,24 @@ public function itAddsHandledStampsProvider() new HandledStamp('first result', $firstClass.'::__invoke', 'first_alias'), new HandledStamp(null, $secondClass.'::__invoke'), ], + true, + ]; + + yield 'It tries all handlers' => [ + ['first' => $first, 'failing' => $failing, 'second' => $second], + [ + new HandledStamp('first result', $firstClass.'::__invoke', 'first'), + new HandledStamp(null, $secondClass.'::__invoke', 'second'), + ], + false, + ]; + + yield 'It ignores duplicated handler' => [ + [$first, $first], + [ + new HandledStamp('first result', $firstClass.'::__invoke'), + ], + true, ]; } diff --git a/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php b/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php new file mode 100644 index 0000000000000..136642885b6e6 --- /dev/null +++ b/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php @@ -0,0 +1,65 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Tests; + +use PHPUnit\Framework\TestCase; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Handler\HandlersLocator; +use Symfony\Component\Messenger\MessageBus; +use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; +use Symfony\Component\Messenger\Middleware\SendMessageMiddleware; +use Symfony\Component\Messenger\Retry\MultiplierRetryStrategy; +use Symfony\Component\Messenger\Stamp\SentStamp; +use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage; +use Symfony\Component\Messenger\Tests\Fixtures\MessageHandlerFailingFirstTimes; +use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface; +use Symfony\Component\Messenger\Transport\Sender\SendersLocator; +use Symfony\Component\Messenger\Worker; + +class RetryIntegrationTest extends TestCase +{ + public function testRetryMechanism() + { + $apiMessage = new DummyMessage('API'); + + $receiver = $this->createMock(ReceiverInterface::class); + $receiver->method('get') + ->willReturn([ + new Envelope($apiMessage, [ + new SentStamp('Some\Sender', 'sender_alias'), + ]), + ]); + + $senderLocator = new SendersLocator([], ['*' => true]); + + $handler = new MessageHandlerFailingFirstTimes(); + $throwingHandler = new MessageHandlerFailingFirstTimes(1); + $handlerLocator = new HandlersLocator([ + DummyMessage::class => [ + 'handler' => $handler, + 'throwing' => $throwingHandler, + ], + ]); + + $bus = new MessageBus([new SendMessageMiddleware($senderLocator), new HandleMessageMiddleware($handlerLocator)]); + + $worker = new Worker(['receiverName' => $receiver], $bus, ['receiverName' => new MultiplierRetryStrategy()]); + $worker->run([], function () use ($worker) { + $worker->stop(); + }); + + $this->assertSame(1, $handler->getTimesCalledWithoutThrowing()); + $this->assertSame(1, $throwingHandler->getTimesCalledWithoutThrowing()); + } +} diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index 1e7f539f6ce40..ee10a2ee71aaf 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -15,6 +15,7 @@ use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent; +use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException; use Symfony\Component\Messenger\Retry\RetryStrategyInterface; @@ -123,6 +124,10 @@ private function handleMessage(Envelope $envelope, ReceiverInterface $receiver, try { $envelope = $this->bus->dispatch($envelope->with(new ReceivedStamp())); } catch (\Throwable $throwable) { + if ($throwable instanceof ChainedHandlerFailedException) { + $envelope = $throwable->getEnvelope(); + } + $shouldRetry = $this->shouldRetry($throwable, $envelope, $retryStrategy); $this->dispatchEvent(new WorkerMessageFailedEvent($envelope, $receiverName, $throwable, $shouldRetry)); From 2e5e910229808c94bec147820701c763d2ad41bd Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Sat, 6 Apr 2019 12:33:50 +0200 Subject: [PATCH 2/2] Rename exception, add change log and a few other things --- src/Symfony/Component/Messenger/CHANGELOG.md | 1 + .../ChainedHandlerFailedException.php | 61 ------------------- .../Exception/HandlerFailedException.php | 52 ++++++++++++++++ .../Middleware/HandleMessageMiddleware.php | 4 +- ... DummyMessageHandlerFailingFirstTimes.php} | 2 +- .../HandleMessageMiddlewareTest.php | 4 +- .../Messenger/Tests/RetryIntegrationTest.php | 8 +-- src/Symfony/Component/Messenger/Worker.php | 4 +- 8 files changed, 63 insertions(+), 73 deletions(-) delete mode 100644 src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php create mode 100644 src/Symfony/Component/Messenger/Exception/HandlerFailedException.php rename src/Symfony/Component/Messenger/Tests/Fixtures/{MessageHandlerFailingFirstTimes.php => DummyMessageHandlerFailingFirstTimes.php} (95%) diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 20a8fff7b4b5c..03b4864520d4d 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -79,6 +79,7 @@ CHANGELOG * Added a `SetupTransportsCommand` command to setup the transports * Added a Doctrine transport. For example, use the `doctrine://default` DSN (this uses the `default` Doctrine entity manager) * [BC BREAK] The `getConnectionConfiguration` method on Amqp's `Connection` has been removed. + * [BC BREAK] A `HandlerFailedException` exception will be thrown if one or more handler fails. 4.2.0 ----- diff --git a/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php b/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php deleted file mode 100644 index e8f360dd85d7a..0000000000000 --- a/src/Symfony/Component/Messenger/Exception/ChainedHandlerFailedException.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace Symfony\Component\Messenger\Exception; - -use Symfony\Component\Messenger\Envelope; - -class ChainedHandlerFailedException extends \RuntimeException implements ExceptionInterface -{ - /** - * @var \Throwable[] - */ - private $nested; - - /** - * @var Envelope - */ - private $envelope; - - public function __construct(Envelope $envelope, \Throwable ...$nested) - { - parent::__construct($this->constructMessage($nested)); - $this->envelope = $envelope; - $this->nested = $nested; - } - - public function getEnvelope(): Envelope - { - return $this->envelope; - } - - /** - * @return \Throwable[] - */ - public function getNestedExceptions(): array - { - return $this->nested; - } - - /** - * @param \Throwable[] $nested - * - * @return string - */ - private function constructMessage(array $nested): string - { - return 1 === \count($nested) ? - $nested[0]->getMessage() : - sprintf('%d MessageHandler failed. First one failed with Message: %s', \count($nested), $nested[0]->getMessage()); - } -} diff --git a/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php b/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php new file mode 100644 index 0000000000000..d0abb7cd4f156 --- /dev/null +++ b/src/Symfony/Component/Messenger/Exception/HandlerFailedException.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Exception; + +use Symfony\Component\Messenger\Envelope; + +class HandlerFailedException extends RuntimeException +{ + private $exceptions; + private $envelope; + + /** + * @param \Throwable[] $exceptions + */ + public function __construct(Envelope $envelope, array $exceptions) + { + $firstFailure = current($exceptions); + + parent::__construct( + 1 === \count($exceptions) + ? $firstFailure->getMessage() + : sprintf('%d handlers failed. First failure is: "%s"', \count($exceptions), $firstFailure->getMessage()), + $firstFailure->getCode(), + $firstFailure + ); + + $this->envelope = $envelope; + $this->exceptions = $exceptions; + } + + public function getEnvelope(): Envelope + { + return $this->envelope; + } + + /** + * @return \Throwable[] + */ + public function getNestedExceptions(): array + { + return $this->exceptions; + } +} diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index c0662ec2915c9..4fc8f6dfcfdd0 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -14,7 +14,7 @@ use Psr\Log\LoggerAwareTrait; use Psr\Log\NullLogger; use Symfony\Component\Messenger\Envelope; -use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; +use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\Exception\NoHandlerForMessageException; use Symfony\Component\Messenger\Handler\HandlersLocatorInterface; use Symfony\Component\Messenger\Stamp\HandledStamp; @@ -79,7 +79,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope } if (\count($exceptions)) { - throw new ChainedHandlerFailedException($envelope, ...$exceptions); + throw new HandlerFailedException($envelope, $exceptions); } return $stack->next()->handle($envelope, $stack); diff --git a/src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageHandlerFailingFirstTimes.php similarity index 95% rename from src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php rename to src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageHandlerFailingFirstTimes.php index d315cb0836206..2e9744538473c 100644 --- a/src/Symfony/Component/Messenger/Tests/Fixtures/MessageHandlerFailingFirstTimes.php +++ b/src/Symfony/Component/Messenger/Tests/Fixtures/DummyMessageHandlerFailingFirstTimes.php @@ -11,7 +11,7 @@ namespace Symfony\Component\Messenger\Tests\Fixtures; -class MessageHandlerFailingFirstTimes +class DummyMessageHandlerFailingFirstTimes { private $remainingFailures; diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php index 20b8667f4ed5c..cd15957f1b0f2 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/HandleMessageMiddlewareTest.php @@ -12,7 +12,7 @@ namespace Symfony\Component\Messenger\Tests\Middleware; use Symfony\Component\Messenger\Envelope; -use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; +use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Middleware\StackMiddleware; @@ -52,7 +52,7 @@ public function testItAddsHandledStamps(array $handlers, array $expectedStamps, try { $envelope = $middleware->handle($envelope, $this->getStackMock($nextIsCalled)); - } catch (ChainedHandlerFailedException $e) { + } catch (HandlerFailedException $e) { $envelope = $e->getEnvelope(); } diff --git a/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php b/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php index 136642885b6e6..00346bbc703c2 100644 --- a/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php +++ b/src/Symfony/Component/Messenger/Tests/RetryIntegrationTest.php @@ -1,7 +1,5 @@ true]); - $handler = new MessageHandlerFailingFirstTimes(); - $throwingHandler = new MessageHandlerFailingFirstTimes(1); + $handler = new DummyMessageHandlerFailingFirstTimes(); + $throwingHandler = new DummyMessageHandlerFailingFirstTimes(1); $handlerLocator = new HandlersLocator([ DummyMessage::class => [ 'handler' => $handler, diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index ee10a2ee71aaf..39fa5a910bd8c 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -15,7 +15,7 @@ use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent; use Symfony\Component\Messenger\Event\WorkerMessageHandledEvent; use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent; -use Symfony\Component\Messenger\Exception\ChainedHandlerFailedException; +use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\Exception\LogicException; use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException; use Symfony\Component\Messenger\Retry\RetryStrategyInterface; @@ -124,7 +124,7 @@ private function handleMessage(Envelope $envelope, ReceiverInterface $receiver, try { $envelope = $this->bus->dispatch($envelope->with(new ReceivedStamp())); } catch (\Throwable $throwable) { - if ($throwable instanceof ChainedHandlerFailedException) { + if ($throwable instanceof HandlerFailedException) { $envelope = $throwable->getEnvelope(); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy