diff --git a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php index f018d5b6a1..e9d0e897d2 100644 --- a/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php @@ -64,7 +64,7 @@ class HandleMessageMiddleware implements MiddlewareInterface $handler = $handlerDescriptor->getHandler(); $handledStamp = HandledStamp::fromDescriptor($handlerDescriptor, $handler($message)); $envelope = $envelope->with($handledStamp); - $this->logger->info('Message "{class}" handled by "{handler}"', $context + ['handler' => $handledStamp->getHandlerName()]); + $this->logger->info('Message {class} handled by {handler}', $context + ['handler' => $handledStamp->getHandlerName()]); } catch (\Throwable $e) { $exceptions[] = $e; } @@ -75,7 +75,7 @@ class HandleMessageMiddleware implements MiddlewareInterface throw new NoHandlerForMessageException(sprintf('No handler for message "%s".', $context['class'])); } - $this->logger->info('No handler for message "{class}"', $context); + $this->logger->info('No handler for message {class}', $context); } if (\count($exceptions)) { diff --git a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php index 2d401bc850..969a120cbf 100644 --- a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php @@ -54,37 +54,30 @@ class SendMessageMiddleware implements MiddlewareInterface $sender = null; - try { - if ($envelope->all(ReceivedStamp::class)) { - // it's a received message, do not send it back - $this->logger->info('Received message "{class}"', $context); - } else { - /** @var RedeliveryStamp|null $redeliveryStamp */ - $redeliveryStamp = $envelope->last(RedeliveryStamp::class); + if ($envelope->all(ReceivedStamp::class)) { + // it's a received message, do not send it back + $this->logger->info('Received message {class}', $context); + } else { + /** @var RedeliveryStamp|null $redeliveryStamp */ + $redeliveryStamp = $envelope->last(RedeliveryStamp::class); - // dispatch event unless this is a redelivery - $shouldDispatchEvent = null === $redeliveryStamp; - foreach ($this->getSenders($envelope, $redeliveryStamp) as $alias => $sender) { - if (null !== $this->eventDispatcher && $shouldDispatchEvent) { - $event = new SendMessageToTransportsEvent($envelope); - $this->eventDispatcher->dispatch($event); - $envelope = $event->getEnvelope(); - $shouldDispatchEvent = false; - } - - $this->logger->info('Sending message "{class}" with "{sender}"', $context + ['sender' => \get_class($sender)]); - $envelope = $sender->send($envelope->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null))); + // dispatch event unless this is a redelivery + $shouldDispatchEvent = null === $redeliveryStamp; + foreach ($this->getSenders($envelope, $redeliveryStamp) as $alias => $sender) { + if (null !== $this->eventDispatcher && $shouldDispatchEvent) { + $event = new SendMessageToTransportsEvent($envelope); + $this->eventDispatcher->dispatch($event); + $envelope = $event->getEnvelope(); + $shouldDispatchEvent = false; } - } - if (null === $sender) { - return $stack->next()->handle($envelope, $stack); + $this->logger->info('Sending message {class} with {sender}', $context + ['sender' => \get_class($sender)]); + $envelope = $sender->send($envelope->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null))); } - } catch (\Throwable $e) { - $context['exception'] = $e; - $this->logger->warning('An exception occurred while handling message "{class}": '.$e->getMessage(), $context); + } - throw $e; + if (null === $sender) { + return $stack->next()->handle($envelope, $stack); } // message should only be sent and not be handled by the next middleware diff --git a/src/Symfony/Component/Messenger/Retry/MultiplierRetryStrategy.php b/src/Symfony/Component/Messenger/Retry/MultiplierRetryStrategy.php index e883b3ffd9..8a44f5fa84 100644 --- a/src/Symfony/Component/Messenger/Retry/MultiplierRetryStrategy.php +++ b/src/Symfony/Component/Messenger/Retry/MultiplierRetryStrategy.php @@ -70,14 +70,14 @@ class MultiplierRetryStrategy implements RetryStrategyInterface return true; } - $retries = $this->getCurrentRetryCount($message); + $retries = RedeliveryStamp::getRetryCountFromEnvelope($message); return $retries < $this->maxRetries; } public function getWaitingTime(Envelope $message): int { - $retries = $this->getCurrentRetryCount($message); + $retries = RedeliveryStamp::getRetryCountFromEnvelope($message); $delay = $this->delayMilliseconds * pow($this->multiplier, $retries); @@ -87,12 +87,4 @@ class MultiplierRetryStrategy implements RetryStrategyInterface return $delay; } - - private function getCurrentRetryCount(Envelope $message): int - { - /** @var RedeliveryStamp|null $retryMessageStamp */ - $retryMessageStamp = $message->last(RedeliveryStamp::class); - - return $retryMessageStamp ? $retryMessageStamp->getRetryCount() : 0; - } } diff --git a/src/Symfony/Component/Messenger/Stamp/RedeliveryStamp.php b/src/Symfony/Component/Messenger/Stamp/RedeliveryStamp.php index 265ee1a628..2895ad9b83 100644 --- a/src/Symfony/Component/Messenger/Stamp/RedeliveryStamp.php +++ b/src/Symfony/Component/Messenger/Stamp/RedeliveryStamp.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Stamp; use Symfony\Component\Debug\Exception\FlattenException; +use Symfony\Component\Messenger\Envelope; /** * Stamp applied when a messages needs to be redelivered. @@ -38,6 +39,14 @@ class RedeliveryStamp implements StampInterface $this->redeliveredAt = new \DateTimeImmutable(); } + public static function getRetryCountFromEnvelope(Envelope $envelope): int + { + /** @var self|null $retryMessageStamp */ + $retryMessageStamp = $envelope->last(self::class); + + return $retryMessageStamp ? $retryMessageStamp->getRetryCount() : 0; + } + public function getRetryCount(): int { return $this->retryCount; diff --git a/src/Symfony/Component/Messenger/Worker.php b/src/Symfony/Component/Messenger/Worker.php index 4d52eb63ba..b54382bd71 100644 --- a/src/Symfony/Component/Messenger/Worker.php +++ b/src/Symfony/Component/Messenger/Worker.php @@ -140,14 +140,16 @@ class Worker implements WorkerInterface $this->dispatchEvent(new WorkerMessageFailedEvent($envelope, $transportName, $throwable, $shouldRetry)); + $retryCount = RedeliveryStamp::getRetryCountFromEnvelope($envelope); if ($shouldRetry) { - $retryCount = $this->getRetryCount($envelope) + 1; + ++$retryCount; + $delay = $retryStrategy->getWaitingTime($envelope); if (null !== $this->logger) { - $this->logger->error('Retrying {class} - retry #{retryCount}.', $context + ['retryCount' => $retryCount, 'error' => $throwable]); + $this->logger->error('Error thrown while handling message {class}. Dispatching for retry #{retryCount} using {delay} ms delay. Error: "{error}"', $context + ['retryCount' => $retryCount, 'delay' => $delay, 'error' => $throwable->getMessage(), 'exception' => $throwable]); } // add the delay and retry stamp info + remove ReceivedStamp - $retryEnvelope = $envelope->with(new DelayStamp($retryStrategy->getWaitingTime($envelope))) + $retryEnvelope = $envelope->with(new DelayStamp($delay)) ->with(new RedeliveryStamp($retryCount, $this->getSenderClassOrAlias($envelope))) ->withoutAll(ReceivedStamp::class); @@ -157,7 +159,7 @@ class Worker implements WorkerInterface $receiver->ack($envelope); } else { if (null !== $this->logger) { - $this->logger->critical('Rejecting {class} (removing from transport).', $context + ['error' => $throwable]); + $this->logger->critical('Error thrown while handling message {class}. Removing from transport after {retryCount} retries. Error: "{error}"', $context + ['retryCount' => $retryCount, 'error' => $throwable->getMessage(), 'exception' => $throwable]); } $receiver->reject($envelope); @@ -207,14 +209,6 @@ class Worker implements WorkerInterface return $retryStrategy->isRetryable($envelope); } - private function getRetryCount(Envelope $envelope): int - { - /** @var RedeliveryStamp|null $retryMessageStamp */ - $retryMessageStamp = $envelope->last(RedeliveryStamp::class); - - return $retryMessageStamp ? $retryMessageStamp->getRetryCount() : 0; - } - private function getSenderClassOrAlias(Envelope $envelope): string { /** @var SentStamp|null $sentStamp */