diff --git a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php index 5302d560f8d94..f430a28b4bfe2 100644 --- a/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php +++ b/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php @@ -271,7 +271,7 @@ public function handleSignal(int $signal, int|false $previousExitCode = 0): int| $this->worker->stop(); - return 0; + return false; } private function convertToBytes(string $memoryLimit): int diff --git a/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php b/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php index c85f2094127e6..adea535a7e6ae 100644 --- a/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php +++ b/src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php @@ -43,6 +43,8 @@ class FailedMessagesRetryCommand extends AbstractFailedMessagesCommand implement private MessageBusInterface $messageBus; private ?LoggerInterface $logger; private ?array $signals; + private bool $shouldStop = false; + private bool $forceExit = false; private ?Worker $worker = null; public function __construct(?string $globalReceiverName, ServiceProviderInterface $failureTransports, MessageBusInterface $messageBus, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null, PhpSerializer $phpSerializer = null, array $signals = null) @@ -141,8 +143,9 @@ public function handleSignal(int $signal, int|false $previousExitCode = 0): int| $this->logger?->info('Received signal {signal}.', ['signal' => $signal, 'transport_names' => $this->worker->getMetadata()->getTransportNames()]); $this->worker->stop(); + $this->shouldStop = true; - return 0; + return $this->forceExit ? 0 : false; } private function runInteractive(string $failureTransportName, SymfonyStyle $io, bool $shouldForce): void @@ -156,6 +159,10 @@ private function runInteractive(string $failureTransportName, SymfonyStyle $io, // to be temporarily "acked", even if the user aborts // handling the message while (true) { + if ($this->shouldStop) { + break; + } + $envelopes = []; $this->phpSerializer?->acceptPhpIncompleteClass(); try { @@ -180,7 +187,7 @@ private function runInteractive(string $failureTransportName, SymfonyStyle $io, } // avoid success message if nothing was processed - if (1 <= $count) { + if (1 <= $count && !$this->shouldStop) { $io->success('All failed messages have been handled or removed!'); } } @@ -198,7 +205,12 @@ private function runWorker(string $failureTransportName, ReceiverInterface $rece throw new \RuntimeException(sprintf('The message with id "%s" could not decoded, it can only be shown or removed.', $this->getMessageId($envelope) ?? '?')); } - $shouldHandle = $shouldForce || 'retry' === $io->choice('Please select an action', ['retry', 'delete'], 'retry'); + $this->forceExit = true; + try { + $shouldHandle = $shouldForce || 'retry' === $io->choice('Please select an action', ['retry', 'delete'], 'retry'); + } finally { + $this->forceExit = false; + } if ($shouldHandle) { return; @@ -257,6 +269,10 @@ private function retrySpecificEnvelopes(array $envelopes, string $failureTranspo foreach ($envelopes as $envelope) { $singleReceiver = new SingleMessageReceiver($receiver, $envelope); $this->runWorker($failureTransportName, $singleReceiver, $io, $shouldForce); + + if ($this->shouldStop) { + break; + } } } }
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: