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

Commit6fa2ded

Browse files
committed
[Messenger] Allow chaining multiple failure transports
1 parent8e47989 commit6fa2ded

File tree

8 files changed

+137
-5
lines changed

8 files changed

+137
-5
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,8 +2342,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23422342
thrownewLogicException(\sprintf('Invalid Messenger configuration: the failure transport "%s" is not a valid transport or service id.',$config['failure_transport']));
23432343
}
23442344

2345-
$container->setAlias('messenger.failure_transports.default','messenger.transport.'.$config['failure_transport']);
2346-
$failureTransports[] =$config['failure_transport'];
2345+
if (!isset($config['transports'][$config['failure_transport']]['failure_transport'])) {
2346+
$container->setAlias('messenger.failure_transports.default','messenger.transport.'.$config['failure_transport']);
2347+
$failureTransports[] =$config['failure_transport'];
2348+
}
23472349
}
23482350

23492351
$failureTransportsByName = [];
@@ -2356,6 +2358,12 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
23562358
}
23572359
}
23582360

2361+
foreach ($failureTransportsas$key =>$failureTransport) {
2362+
if (isset($config['transports'][$failureTransport]['failure_transport'])) {
2363+
unset($failureTransports[$key]);
2364+
}
2365+
}
2366+
23592367
$senderAliases = [];
23602368
$transportRetryReferences = [];
23612369
$transportRateLimiterReferences = [];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'annotations' =>false,
5+
'http_method_override' =>false,
6+
'handle_all_throwables' =>true,
7+
'php_errors' => ['log' =>true],
8+
'messenger' => [
9+
'transports' => [
10+
'transport_1' => [
11+
'dsn' =>'null://',
12+
'failure_transport' =>'transport_2',
13+
],
14+
'transport_2' => [
15+
'dsn' =>'null://',
16+
'failure_transport' =>'failure_transport_1',
17+
],
18+
'failure_transport_1' =>'null://',
19+
],
20+
],
21+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<containerxmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:confighttp-method-override="false"handle-all-throwables="true">
9+
<framework:annotationsenabled="false" />
10+
<framework:php-errorslog="true" />
11+
<framework:messenger>
12+
<framework:transportname="transport_1"dsn="null://"failure-transport="transport_2" />
13+
<framework:transportname="transport_2"dsn="null://"failure-transport="failure_transport_1"/>
14+
<framework:transportname="failure_transport_1"dsn="null://" />
15+
</framework:messenger>
16+
</framework:config>
17+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
framework:
2+
annotations:false
3+
http_method_override:false
4+
handle_all_throwables:true
5+
php_errors:
6+
log:true
7+
messenger:
8+
transports:
9+
transport_1:
10+
dsn:'null://'
11+
failure_transport:transport_2
12+
transport_2:
13+
dsn:'null://'
14+
failure_transport:failure_transport_1
15+
failure_transport_1:'null://'

‎src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,41 @@ public function testMessengerMultipleFailureTransports()
902902
$this->assertEquals($expectedTransportsByFailureTransports,$failureTransportsReferences);
903903
}
904904

905+
publicfunctiontestMessengerFailureTransportChain()
906+
{
907+
$container =$this->createContainerFromFile('messenger_failure_transport_chain');
908+
909+
$failureTransport1Definition =$container->getDefinition('messenger.transport.failure_transport_1');
910+
$failureTransport1Tags =$failureTransport1Definition->getTag('messenger.receiver')[0];
911+
912+
$this->assertEquals([
913+
'alias' =>'failure_transport_1',
914+
'is_failure_transport' =>true,
915+
],$failureTransport1Tags);
916+
917+
$intermediateFailureTransportDefinition =$container->getDefinition('messenger.transport.transport_2');
918+
$failureTransport3Tags =$intermediateFailureTransportDefinition->getTag('messenger.receiver')[0];
919+
920+
$this->assertEquals([
921+
'alias' =>'transport_2',
922+
'is_failure_transport' =>false,
923+
],$failureTransport3Tags);
924+
925+
$failureTransportsByTransportNameServiceLocator =$container->getDefinition('messenger.failure.send_failed_message_to_failure_transport_listener')->getArgument(0);
926+
$failureTransports =$container->getDefinition((string)$failureTransportsByTransportNameServiceLocator)->getArgument(0);
927+
$expectedTransportsByFailureTransports = [
928+
'transport_1' =>newReference('messenger.transport.transport_2'),
929+
'transport_2' =>newReference('messenger.transport.failure_transport_1'),
930+
];
931+
932+
$failureTransportsReferences =array_map(function (ServiceClosureArgument$serviceClosureArgument) {
933+
$values =$serviceClosureArgument->getValues();
934+
935+
returnarray_shift($values);
936+
},$failureTransports);
937+
$this->assertEquals($expectedTransportsByFailureTransports,$failureTransportsReferences);
938+
}
939+
905940
publicfunctiontestMessengerMultipleFailureTransportsWithGlobalFailureTransport()
906941
{
907942
$container =$this->createContainerFromFile('messenger_multiple_failure_transports_global');

‎src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add`SentForRetryStamp` that identifies whether a failed message was sent for retry
88
* Add`Symfony\Component\Messenger\Middleware\DeduplicateMiddleware` and`Symfony\Component\Messenger\Stamp\DeduplicateStamp`
9+
* Add ability to chain failure transports. A failed message will process through the respective failure transports until arriving at the final one.
910

1011
7.2
1112
---

‎src/Symfony/Component/Messenger/EventListener/SendFailedMessageToFailureTransportListener.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,11 @@ public function onMessageFailed(WorkerMessageFailedEvent $event): void
4747

4848
$envelope =$event->getEnvelope();
4949

50-
// avoid re-sending to the failed sender
51-
if (null !==$envelope->last(SentToFailureTransportStamp::class)) {
52-
return;
50+
// avoid re-sending to same failed sender again
51+
foreach ($envelope->all(SentToFailureTransportStamp::class)as$stamp) {
52+
if ($stamp->getOriginalReceiverName() ===$event->getReceiverName()) {
53+
return;
54+
}
5355
}
5456

5557
$envelope =$envelope->with(

‎src/Symfony/Component/Messenger/Tests/EventListener/SendFailedMessageToFailureTransportListenerTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,37 @@ public function testItSendsToTheFailureTransportWithMultipleFailedTransports()
124124

125125
$listener->onMessageFailed($event);
126126
}
127+
128+
publicfunctiontestItResendsToTheFailureTransportWithSenderLocator()
129+
{
130+
$receiverName ='my_receiver';
131+
$sender =$this->createMock(SenderInterface::class);
132+
$sender->expects($this->once())->method('send')->with($this->callback(function ($envelope)use ($receiverName) {
133+
/* @var Envelope $envelope */
134+
$this->assertInstanceOf(Envelope::class,$envelope);
135+
136+
$this->assertCount(2,$envelope->all(SentToFailureTransportStamp::class));
137+
138+
/** @var SentToFailureTransportStamp $sentToFailureTransportStamp */
139+
$sentToFailureTransportStamp =$envelope->last(SentToFailureTransportStamp::class);
140+
$this->assertNotNull($sentToFailureTransportStamp);
141+
$this->assertSame($receiverName,$sentToFailureTransportStamp->getOriginalReceiverName());
142+
143+
returntrue;
144+
}))->willReturnArgument(0);
145+
146+
$serviceLocator =$this->createMock(ServiceLocator::class);
147+
$serviceLocator->expects($this->once())->method('has')->willReturn(true);
148+
$serviceLocator->expects($this->once())->method('get')->with($receiverName)->willReturn($sender);
149+
$listener =newSendFailedMessageToFailureTransportListener($serviceLocator);
150+
151+
$exception =new \Exception('no!');
152+
$envelope =newEnvelope(
153+
new \stdClass(),
154+
[newSentToFailureTransportStamp('my_other_receiver')],
155+
);
156+
$event =newWorkerMessageFailedEvent($envelope,'my_receiver',$exception);
157+
158+
$listener->onMessageFailed($event);
159+
}
127160
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp