Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5f3e52f

Browse files
committed
add multiple failed transport support for failed commands
1 parent f78bf7f commit 5f3e52f

File tree

6 files changed

+76
-37
lines changed

6 files changed

+76
-37
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1741,30 +1741,26 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17411741
$container->getDefinition('messenger.retry_strategy_locator')
17421742
->replaceArgument(0, $transportRetryReferences);
17431743

1744-
$failureTransports = [];
17451744
$hasAnyFailureTransport = false;
1745+
1746+
$failureTransports = [];
17461747
$failureTransportsServiceLocatorId = 'messenger.failure_transports.locator';
1748+
$failureTransportsByName = [];
1749+
$failureTransportsByNameServiceLocatorId = 'messenger.failure_transports_by_name.locator';
1750+
17471751
if ($config['failure_transport']) {
17481752
if (!isset($senderReferences[$config['failure_transport']])) {
17491753
throw new LogicException(sprintf('Invalid Messenger configuration: the failure transport "%s" is not a valid transport or service id.', $config['failure_transport']));
17501754
}
17511755

17521756
$hasAnyFailureTransport = true;
1757+
$failureTransportRef = $senderReferences[$config['failure_transport']];
1758+
$failureTransportsByName[$config['failure_transport']] = $failureTransportRef;
1759+
17531760
$container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener')
1754-
->replaceArgument(0, $senderReferences[$config['failure_transport']]);
1761+
->replaceArgument(0, $failureTransportRef);
17551762
$container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener')
17561763
->replaceArgument(2, null);
1757-
1758-
$container->getDefinition('console.command.messenger_failed_messages_retry')
1759-
->replaceArgument(0, $config['failure_transport']);
1760-
$container->getDefinition('console.command.messenger_failed_messages_show')
1761-
->replaceArgument(0, $config['failure_transport']);
1762-
$container->getDefinition('console.command.messenger_failed_messages_remove')
1763-
->replaceArgument(0, $config['failure_transport']);
1764-
} else {
1765-
$container->removeDefinition('console.command.messenger_failed_messages_retry');
1766-
$container->removeDefinition('console.command.messenger_failed_messages_show');
1767-
$container->removeDefinition('console.command.messenger_failed_messages_remove');
17681764
}
17691765

17701766
foreach ($config['transports'] as $name => $transport) {
@@ -1775,6 +1771,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17751771

17761772
$hasAnyFailureTransport = true;
17771773
$failureTransports[$name] = $senderReferences[$transport['failure_transport']];
1774+
$failureTransportsByName[$transport['failure_transport']] = $senderReferences[$transport['failure_transport']];
17781775
}
17791776
}
17801777

@@ -1787,7 +1784,31 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17871784
->replaceArgument(0, $senderReferences[$config['failure_transport']] ?? null);
17881785
$container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener')
17891786
->replaceArgument(2, \count($failureTransports) > 0 ? $failureTransportsServiceLocator : null);
1787+
1788+
$failureTransportsByNameServiceLocator = ServiceLocatorTagPass::register($container, $failureTransportsByName, $failureTransportsByNameServiceLocatorId);
1789+
$container->getDefinition($failureTransportsByNameServiceLocatorId)
1790+
->replaceArgument(0, $failureTransportsByName)
1791+
->replaceArgument(1, $failureTransportsByNameServiceLocator);
1792+
1793+
$container->getDefinition('console.command.messenger_failed_messages_retry')
1794+
->replaceArgument(0, $config['failure_transport'] ?? null)
1795+
->replaceArgument(1, $failureTransportsByName[$config['failure_transport']] ?? null)
1796+
->replaceArgument(5, $container->getDefinition($failureTransportsByNameServiceLocatorId));
1797+
1798+
$container->getDefinition('console.command.messenger_failed_messages_show')
1799+
->replaceArgument(0, $config['failure_transport'] ?? null)
1800+
->replaceArgument(1, $failureTransportsByName[$config['failure_transport']] ?? null)
1801+
->replaceArgument(2, $container->getDefinition($failureTransportsByNameServiceLocatorId));
1802+
1803+
$container->getDefinition('console.command.messenger_failed_messages_remove')
1804+
->replaceArgument(0, $config['failure_transport'] ?? null)
1805+
->replaceArgument(1, $failureTransportsByName[$config['failure_transport']] ?? null)
1806+
->replaceArgument(2, $container->getDefinition($failureTransportsByNameServiceLocatorId));;
1807+
17901808
} else {
1809+
$container->removeDefinition('console.command.messenger_failed_messages_retry');
1810+
$container->removeDefinition('console.command.messenger_failed_messages_show');
1811+
$container->removeDefinition('console.command.messenger_failed_messages_remove');
17911812
$container->removeDefinition('messenger.failure.send_failed_message_to_failure_transport_listener');
17921813
}
17931814
}

src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,20 +119,23 @@
119119
<argument type="service" id="messenger.routable_message_bus" />
120120
<argument type="service" id="event_dispatcher" />
121121
<argument type="service" id="logger" />
122+
<argument id="messenger.failure_transports_by_name.locator" /> <!-- Failed transports service locator -->
122123

123124
<tag name="console.command" command="messenger:failed:retry" />
124125
</service>
125126

126127
<service id="console.command.messenger_failed_messages_show" class="Symfony\Component\Messenger\Command\FailedMessagesShowCommand">
127128
<argument /> <!-- Receiver name -->
128129
<argument /> <!-- Receiver -->
130+
<argument id="messenger.failure_transports_by_name.locator" /> <!-- Failed transports service locator -->
129131

130132
<tag name="console.command" command="messenger:failed:show" />
131133
</service>
132134

133135
<service id="console.command.messenger_failed_messages_remove" class="Symfony\Component\Messenger\Command\FailedMessagesRemoveCommand">
134136
<argument /> <!-- Receiver name -->
135137
<argument /> <!-- Receiver -->
138+
<argument id="messenger.failure_transports_by_name.locator" /> <!-- Failed transports service locator -->
136139

137140
<tag name="console.command" command="messenger:failed:remove" />
138141
</service>

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@
9696
<argument /> <!-- failure transports locator -->
9797
</service>
9898

99+
<!-- failure transports locator per name -->
100+
<service id="messenger.failure_transports_by_name.locator" class="Symfony\Component\DependencyInjection\ServiceLocator">
101+
<tag name="container.service_locator" />
102+
<argument type="collection" /> <!-- failure transports map by name -->
103+
<argument /> <!-- failure transports locator -->
104+
</service>
105+
99106
<!-- retry -->
100107
<service id="messenger.retry_strategy_locator">
101108
<tag name="container.service_locator" />

src/Symfony/Component/Messenger/Command/FailedMessagesRemoveCommand.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ protected function configure(): void
3535
{
3636
$this
3737
->setDefinition([
38+
new InputArgument('failed-transport', InputArgument::REQUIRED, 'failed transport name'),
3839
new InputArgument('id', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'Specific message id(s) to remove'),
3940
new InputOption('force', null, InputOption::VALUE_NONE, 'Force the operation without confirmation'),
4041
new InputOption('show-messages', null, InputOption::VALUE_NONE, 'Display messages before removing it (if multiple ids are given)'),
@@ -58,7 +59,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
5859
{
5960
$io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
6061

61-
$receiver = $this->getReceiver();
62+
$receiver = $this->getReceiver($input->getArgument('failed-transport'));
6263

6364
$shouldForce = $input->getOption('force');
6465
$ids = $input->getArgument('id');

src/Symfony/Component/Messenger/Command/FailedMessagesRetryCommand.php

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Symfony\Component\Console\Output\ConsoleOutputInterface;
2020
use Symfony\Component\Console\Output\OutputInterface;
2121
use Symfony\Component\Console\Style\SymfonyStyle;
22+
use Symfony\Component\DependencyInjection\ServiceLocator;
2223
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
2324
use Symfony\Component\Messenger\Event\WorkerMessageReceivedEvent;
2425
use Symfony\Component\Messenger\EventListener\StopWorkerOnMessageLimitListener;
@@ -39,14 +40,15 @@ class FailedMessagesRetryCommand extends AbstractFailedMessagesCommand
3940
private $eventDispatcher;
4041
private $messageBus;
4142
private $logger;
43+
private $failedTransportsByName;
4244

43-
public function __construct(string $receiverName, ReceiverInterface $receiver, MessageBusInterface $messageBus, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null)
45+
public function __construct(string $receiverName, ReceiverInterface $receiver, MessageBusInterface $messageBus, EventDispatcherInterface $eventDispatcher, LoggerInterface $logger = null, ServiceLocator $failedTransportsByName)
4446
{
4547
$this->eventDispatcher = $eventDispatcher;
4648
$this->messageBus = $messageBus;
4749
$this->logger = $logger;
4850

49-
parent::__construct($receiverName, $receiver);
51+
parent::__construct($receiverName, $receiver, $failedTransportsByName);
5052
}
5153

5254
/**
@@ -56,6 +58,7 @@ protected function configure(): void
5658
{
5759
$this
5860
->setDefinition([
61+
new InputArgument('failed-transport', InputArgument::REQUIRED, 'failed transport name'),
5962
new InputArgument('id', InputArgument::IS_ARRAY, 'Specific message id(s) to retry'),
6063
new InputOption('force', null, InputOption::VALUE_NONE, 'Force action without confirmation'),
6164
])
@@ -95,10 +98,11 @@ protected function execute(InputInterface $input, OutputInterface $output)
9598
$io->comment('Re-run the command with a -vv option to see logs about consumed messages.');
9699
}
97100

98-
$receiver = $this->getReceiver();
101+
$failedTransport = $input->getArgument('failed-transport');
102+
$receiver = $this->getReceiver($failedTransport);
99103
$this->printPendingMessagesMessage($receiver, $io);
100104

101-
$io->writeln(sprintf('To retry all the messages, run <comment>messenger:consume %s</comment>', $this->getReceiverName()));
105+
$io->writeln(sprintf('To retry all the messages, run <comment>messenger:consume %s</comment>', $this->getReceiverName($failedTransport)));
102106

103107
$shouldForce = $input->getOption('force');
104108
$ids = $input->getArgument('id');
@@ -107,20 +111,20 @@ protected function execute(InputInterface $input, OutputInterface $output)
107111
throw new RuntimeException('Message id must be passed when in non-interactive mode.');
108112
}
109113

110-
$this->runInteractive($io, $shouldForce);
114+
$this->runInteractive($failedTransport, $io, $shouldForce);
111115

112116
return 0;
113117
}
114118

115-
$this->retrySpecificIds($ids, $io, $shouldForce);
119+
$this->retrySpecificIds($failedTransport, $ids, $io, $shouldForce);
116120
$io->success('All done!');
117121

118122
return 0;
119123
}
120124

121-
private function runInteractive(SymfonyStyle $io, bool $shouldForce)
125+
private function runInteractive(string $failedTransport, SymfonyStyle $io, bool $shouldForce)
122126
{
123-
$receiver = $this->getReceiver();
127+
$receiver = $this->getReceiver($failedTransport);
124128
$count = 0;
125129
if ($receiver instanceof ListableReceiverInterface) {
126130
// for listable receivers, find the messages one-by-one
@@ -135,7 +139,7 @@ private function runInteractive(SymfonyStyle $io, bool $shouldForce)
135139

136140
$id = $this->getMessageId($envelope);
137141
if (null === $id) {
138-
throw new LogicException(sprintf('The "%s" receiver is able to list messages by id but the envelope is missing the TransportMessageIdStamp stamp.', $this->getReceiverName()));
142+
throw new LogicException(sprintf('The "%s" receiver is able to list messages by id but the envelope is missing the TransportMessageIdStamp stamp.', $this->getReceiverName($failedTransport)));
139143
}
140144
$ids[] = $id;
141145
}
@@ -145,11 +149,11 @@ private function runInteractive(SymfonyStyle $io, bool $shouldForce)
145149
break;
146150
}
147151

148-
$this->retrySpecificIds($ids, $io, $shouldForce);
152+
$this->retrySpecificIds($failedTransport, $ids, $io, $shouldForce);
149153
}
150154
} else {
151155
// get() and ask messages one-by-one
152-
$count = $this->runWorker($this->getReceiver(), $io, $shouldForce);
156+
$count = $this->runWorker($this->getReceiver($failedTransport), $io, $shouldForce);
153157
}
154158

155159
// avoid success message if nothing was processed
@@ -158,7 +162,7 @@ private function runInteractive(SymfonyStyle $io, bool $shouldForce)
158162
}
159163
}
160164

161-
private function runWorker(ReceiverInterface $receiver, SymfonyStyle $io, bool $shouldForce): int
165+
private function runWorker(string $failedTransport, ReceiverInterface $receiver, SymfonyStyle $io, bool $shouldForce): int
162166
{
163167
$count = 0;
164168
$listener = function (WorkerMessageReceivedEvent $messageReceivedEvent) use ($io, $receiver, $shouldForce, &$count) {
@@ -179,7 +183,7 @@ private function runWorker(ReceiverInterface $receiver, SymfonyStyle $io, bool $
179183
$this->eventDispatcher->addListener(WorkerMessageReceivedEvent::class, $listener);
180184

181185
$worker = new Worker(
182-
[$this->getReceiverName() => $receiver],
186+
[$this->getReceiverName($failedTransport) => $receiver],
183187
$this->messageBus,
184188
$this->eventDispatcher,
185189
$this->logger
@@ -194,12 +198,12 @@ private function runWorker(ReceiverInterface $receiver, SymfonyStyle $io, bool $
194198
return $count;
195199
}
196200

197-
private function retrySpecificIds(array $ids, SymfonyStyle $io, bool $shouldForce)
201+
private function retrySpecificIds(string $failedTransport, array $ids, SymfonyStyle $io, bool $shouldForce)
198202
{
199-
$receiver = $this->getReceiver();
203+
$receiver = $this->getReceiver($failedTransport);
200204

201205
if (!$receiver instanceof ListableReceiverInterface) {
202-
throw new RuntimeException(sprintf('The "%s" receiver does not support retrying messages by id.', $this->getReceiverName()));
206+
throw new RuntimeException(sprintf('The "%s" receiver does not support retrying messages by id.', $this->getReceiverName($failedTransport)));
203207
}
204208

205209
foreach ($ids as $id) {
@@ -209,7 +213,7 @@ private function retrySpecificIds(array $ids, SymfonyStyle $io, bool $shouldForc
209213
}
210214

211215
$singleReceiver = new SingleMessageReceiver($receiver, $envelope);
212-
$this->runWorker($singleReceiver, $io, $shouldForce);
216+
$this->runWorker($failedTransport, $singleReceiver, $io, $shouldForce);
213217
}
214218
}
215219
}

src/Symfony/Component/Messenger/Command/FailedMessagesShowCommand.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ protected function configure(): void
3434
{
3535
$this
3636
->setDefinition([
37+
new InputArgument('failed-transport', InputArgument::REQUIRED, 'failed transport name'),
3738
new InputArgument('id', InputArgument::OPTIONAL, 'Specific message id to show'),
3839
new InputOption('max', null, InputOption::VALUE_REQUIRED, 'Maximum number of messages to list', 50),
3940
])
@@ -58,26 +59,28 @@ protected function execute(InputInterface $input, OutputInterface $output)
5859
{
5960
$io = new SymfonyStyle($input, $output instanceof ConsoleOutputInterface ? $output->getErrorOutput() : $output);
6061

61-
$receiver = $this->getReceiver();
62+
$failedTransport = $input->getArgument('failed-transport');
63+
$receiver = $this->getReceiver($failedTransport);
64+
6265
$this->printPendingMessagesMessage($receiver, $io);
6366

6467
if (!$receiver instanceof ListableReceiverInterface) {
6568
throw new RuntimeException(sprintf('The "%s" receiver does not support listing or showing specific messages.', $this->getReceiverName()));
6669
}
6770

6871
if (null === $id = $input->getArgument('id')) {
69-
$this->listMessages($io, $input->getOption('max'));
72+
$this->listMessages($failedTransport, $io, $input->getOption('max'));
7073
} else {
7174
$this->showMessage($id, $io);
7275
}
7376

7477
return 0;
7578
}
7679

77-
private function listMessages(SymfonyStyle $io, int $max)
80+
private function listMessages(string $failedTransport, SymfonyStyle $io, int $max)
7881
{
7982
/** @var ListableReceiverInterface $receiver */
80-
$receiver = $this->getReceiver();
83+
$receiver = $this->getReceiver($failedTransport);
8184
$envelopes = $receiver->all($max);
8285

8386
$rows = [];
@@ -107,10 +110,10 @@ private function listMessages(SymfonyStyle $io, int $max)
107110
$io->comment('Run <comment>messenger:failed:show {id} -vv</comment> to see message details.');
108111
}
109112

110-
private function showMessage(string $id, SymfonyStyle $io)
113+
private function showMessage(string $failedTransport, string $id, SymfonyStyle $io)
111114
{
112115
/** @var ListableReceiverInterface $receiver */
113-
$receiver = $this->getReceiver();
116+
$receiver = $this->getReceiver($failedTransport);
114117
$envelope = $receiver->find($id);
115118
if (null === $envelope) {
116119
throw new RuntimeException(sprintf('The message "%s" was not found.', $id));

0 commit comments

Comments
 (0)