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

Skip to content

Commit 533f5b7

Browse files
committed
[Messenger] Move RejectRedeliveredMessageMiddleware to AMQP Package.
1 parent c71c872 commit 533f5b7

File tree

6 files changed

+72
-40
lines changed

6 files changed

+72
-40
lines changed

UPGRADE-5.4.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
UPGRADE FROM 5.3 to 5.4
22
=======================
33

4+
Messenger
5+
---------
6+
* Deprecate `Middleware\RejectRedeliveredMessageMiddleware`. Install `symfony/amqp-messenger` and use same class from there.
7+
8+
49
FrameworkBundle
510
---------------
611

UPGRADE-6.0.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ Mailer
132132

133133
Messenger
134134
---------
135-
135+
* Removed `Middleware\RejectRedeliveredMessageMiddleware`. Use same class from `composer require symfony/amqp-messenger`.
136136
* Removed AmqpExt transport. Run `composer require symfony/amqp-messenger` to keep the transport in your application.
137137
* Removed Doctrine transport. Run `composer require symfony/doctrine-messenger` to keep the transport in your application.
138138
* Removed RedisExt transport. Run `composer require symfony/redis-messenger` to keep the transport in your application.

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\DependencyInjection\ServiceLocator;
1515
use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransportFactory;
16+
use Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware;
1617
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory;
1718
use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdTransportFactory;
1819
use Symfony\Component\Messenger\Bridge\Redis\Transport\RedisTransportFactory;
@@ -26,7 +27,6 @@
2627
use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware;
2728
use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware;
2829
use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware;
29-
use Symfony\Component\Messenger\Middleware\RejectRedeliveredMessageMiddleware;
3030
use Symfony\Component\Messenger\Middleware\RouterContextMiddleware;
3131
use Symfony\Component\Messenger\Middleware\SendMessageMiddleware;
3232
use Symfony\Component\Messenger\Middleware\TraceableMiddleware;
@@ -43,8 +43,8 @@
4343
use Symfony\Component\Messenger\Transport\TransportFactory;
4444

4545
return static function (ContainerConfigurator $container) {
46-
$container->services()
47-
->alias(SerializerInterface::class, 'messenger.default_serializer')
46+
$services = $container->services();
47+
$services->alias(SerializerInterface::class, 'messenger.default_serializer')
4848

4949
// Asynchronous
5050
->set('messenger.senders_locator', SendersLocator::class)
@@ -90,11 +90,13 @@
9090
->set('messenger.middleware.validation', ValidationMiddleware::class)
9191
->args([
9292
service('validator'),
93-
])
93+
]);
9494

95-
->set('messenger.middleware.reject_redelivered_message_middleware', RejectRedeliveredMessageMiddleware::class)
95+
if (class_exists(RejectRedeliveredMessageMiddleware::class)) {
96+
$services->set('messenger.middleware.reject_redelivered_message_middleware', RejectRedeliveredMessageMiddleware::class);
97+
}
9698

97-
->set('messenger.middleware.failed_message_processing_middleware', FailedMessageProcessingMiddleware::class)
99+
$services->set('messenger.middleware.failed_message_processing_middleware', FailedMessageProcessingMiddleware::class)
98100

99101
->set('messenger.middleware.traceable', TraceableMiddleware::class)
100102
->abstract()
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Messenger\Bridge\Amqp\Middleware;
13+
14+
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpReceivedStamp;
15+
use Symfony\Component\Messenger\Envelope;
16+
use Symfony\Component\Messenger\Exception\RejectRedeliveredMessageException;
17+
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
18+
use Symfony\Component\Messenger\Middleware\StackInterface;
19+
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpReceivedStamp as LegacyAmqpReceivedStamp;
20+
21+
/**
22+
* Middleware that throws a RejectRedeliveredMessageException when a message is detected that has been redelivered by AMQP.
23+
*
24+
* The middleware runs before the HandleMessageMiddleware and prevents redelivered messages from being handled directly.
25+
* The thrown exception is caught by the worker and will trigger the retry logic according to the retry strategy.
26+
*
27+
* AMQP redelivers messages when they do not get acknowledged or rejected. This can happen when the connection times out
28+
* or an exception is thrown before acknowledging or rejecting. When such errors happen again while handling the
29+
* redelivered message, the message would get redelivered again and again. The purpose of this middleware is to prevent
30+
* infinite redelivery loops and to unblock the queue by republishing the redelivered messages as retries with a retry
31+
* limit and potential delay.
32+
*
33+
* @author Tobias Schultze <http://tobion.de>
34+
*/
35+
class RejectRedeliveredMessageMiddleware implements MiddlewareInterface
36+
{
37+
public function handle(Envelope $envelope, StackInterface $stack): Envelope
38+
{
39+
$amqpReceivedStamp = $envelope->last(AmqpReceivedStamp::class);
40+
if ($amqpReceivedStamp instanceof AmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) {
41+
throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.');
42+
}
43+
44+
// Legacy code to support symfony/messenger < 5.1
45+
$amqpReceivedStamp = $envelope->last(LegacyAmqpReceivedStamp::class);
46+
if ($amqpReceivedStamp instanceof LegacyAmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) {
47+
throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.');
48+
}
49+
50+
return $stack->next()->handle($envelope, $stack);
51+
}
52+
}

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
CHANGELOG
22
=========
33

4+
5.4
5+
---
6+
* Deprecate `Middleware\RejectRedeliveredMessageMiddleware`. Install `symfony/amqp-messenger` and use same class from there.
7+
48
5.3
59
---
610

src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,9 @@
1111

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14-
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpReceivedStamp;
15-
use Symfony\Component\Messenger\Envelope;
16-
use Symfony\Component\Messenger\Exception\RejectRedeliveredMessageException;
17-
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpReceivedStamp as LegacyAmqpReceivedStamp;
18-
1914
/**
20-
* Middleware that throws a RejectRedeliveredMessageException when a message is detected that has been redelivered by AMQP.
21-
*
22-
* The middleware runs before the HandleMessageMiddleware and prevents redelivered messages from being handled directly.
23-
* The thrown exception is caught by the worker and will trigger the retry logic according to the retry strategy.
24-
*
25-
* AMQP redelivers messages when they do not get acknowledged or rejected. This can happen when the connection times out
26-
* or an exception is thrown before acknowledging or rejecting. When such errors happen again while handling the
27-
* redelivered message, the message would get redelivered again and again. The purpose of this middleware is to prevent
28-
* infinite redelivery loops and to unblock the queue by republishing the redelivered messages as retries with a retry
29-
* limit and potential delay.
30-
*
31-
* @author Tobias Schultze <http://tobion.de>
15+
* @deprecated since Symfony 5.4, to be removed in 6.0. Use Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware instead.
3216
*/
33-
class RejectRedeliveredMessageMiddleware implements MiddlewareInterface
17+
class RejectRedeliveredMessageMiddleware extends \Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware
3418
{
35-
public function handle(Envelope $envelope, StackInterface $stack): Envelope
36-
{
37-
$amqpReceivedStamp = $envelope->last(AmqpReceivedStamp::class);
38-
if ($amqpReceivedStamp instanceof AmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) {
39-
throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.');
40-
}
41-
42-
// Legacy code to support symfony/messenger < 5.1
43-
$amqpReceivedStamp = $envelope->last(LegacyAmqpReceivedStamp::class);
44-
if ($amqpReceivedStamp instanceof LegacyAmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) {
45-
throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.');
46-
}
47-
48-
return $stack->next()->handle($envelope, $stack);
49-
}
5019
}

0 commit comments

Comments
 (0)