From e293f17fe714e579092651d9ec613e421f5797b8 Mon Sep 17 00:00:00 2001 From: Bozhidar Hristov Date: Sat, 19 Jun 2021 19:02:30 +0300 Subject: [PATCH] [Messenger] Move RejectRedeliveredMessageMiddleware to AMQP Package. --- UPGRADE-5.4.md | 5 ++ UPGRADE-6.0.md | 2 +- .../Resources/config/messenger.php | 14 ++--- .../RejectRedeliveredMessageMiddleware.php | 52 +++++++++++++++++++ src/Symfony/Component/Messenger/CHANGELOG.md | 4 ++ .../RejectRedeliveredMessageMiddleware.php | 35 +------------ 6 files changed, 72 insertions(+), 40 deletions(-) create mode 100644 src/Symfony/Component/Messenger/Bridge/Amqp/Middleware/RejectRedeliveredMessageMiddleware.php diff --git a/UPGRADE-5.4.md b/UPGRADE-5.4.md index 9c81e39a2f9cd..cc91a4c2cb0f9 100644 --- a/UPGRADE-5.4.md +++ b/UPGRADE-5.4.md @@ -1,6 +1,11 @@ UPGRADE FROM 5.3 to 5.4 ======================= +Messenger +--------- +* Deprecate `Middleware\RejectRedeliveredMessageMiddleware`. Install `symfony/amqp-messenger` and use same class from there. + + FrameworkBundle --------------- diff --git a/UPGRADE-6.0.md b/UPGRADE-6.0.md index 30f6f1fa5861f..95f1e7ea9ee94 100644 --- a/UPGRADE-6.0.md +++ b/UPGRADE-6.0.md @@ -132,7 +132,7 @@ Mailer Messenger --------- - + * Removed `Middleware\RejectRedeliveredMessageMiddleware`. Use same class from `symfony/amqp-messenger`. * Removed AmqpExt transport. Run `composer require symfony/amqp-messenger` to keep the transport in your application. * Removed Doctrine transport. Run `composer require symfony/doctrine-messenger` to keep the transport in your application. * Removed RedisExt transport. Run `composer require symfony/redis-messenger` to keep the transport in your application. diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php index 61a993b255174..c011e90070795 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php @@ -13,6 +13,7 @@ use Symfony\Component\DependencyInjection\ServiceLocator; use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransportFactory; +use Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware; use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory; use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdTransportFactory; use Symfony\Component\Messenger\Bridge\Redis\Transport\RedisTransportFactory; @@ -26,7 +27,6 @@ use Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware; use Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; -use Symfony\Component\Messenger\Middleware\RejectRedeliveredMessageMiddleware; use Symfony\Component\Messenger\Middleware\RouterContextMiddleware; use Symfony\Component\Messenger\Middleware\SendMessageMiddleware; use Symfony\Component\Messenger\Middleware\TraceableMiddleware; @@ -43,8 +43,8 @@ use Symfony\Component\Messenger\Transport\TransportFactory; return static function (ContainerConfigurator $container) { - $container->services() - ->alias(SerializerInterface::class, 'messenger.default_serializer') + $services = $container->services(); + $services->alias(SerializerInterface::class, 'messenger.default_serializer') // Asynchronous ->set('messenger.senders_locator', SendersLocator::class) @@ -90,11 +90,13 @@ ->set('messenger.middleware.validation', ValidationMiddleware::class) ->args([ service('validator'), - ]) + ]); - ->set('messenger.middleware.reject_redelivered_message_middleware', RejectRedeliveredMessageMiddleware::class) + if (class_exists(RejectRedeliveredMessageMiddleware::class)) { + $services->set('messenger.middleware.reject_redelivered_message_middleware', RejectRedeliveredMessageMiddleware::class); + } - ->set('messenger.middleware.failed_message_processing_middleware', FailedMessageProcessingMiddleware::class) + $services->set('messenger.middleware.failed_message_processing_middleware', FailedMessageProcessingMiddleware::class) ->set('messenger.middleware.traceable', TraceableMiddleware::class) ->abstract() diff --git a/src/Symfony/Component/Messenger/Bridge/Amqp/Middleware/RejectRedeliveredMessageMiddleware.php b/src/Symfony/Component/Messenger/Bridge/Amqp/Middleware/RejectRedeliveredMessageMiddleware.php new file mode 100644 index 0000000000000..31d5e6b03ad6c --- /dev/null +++ b/src/Symfony/Component/Messenger/Bridge/Amqp/Middleware/RejectRedeliveredMessageMiddleware.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Bridge\Amqp\Middleware; + +use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpReceivedStamp; +use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Exception\RejectRedeliveredMessageException; +use Symfony\Component\Messenger\Middleware\MiddlewareInterface; +use Symfony\Component\Messenger\Middleware\StackInterface; +use Symfony\Component\Messenger\Transport\AmqpExt\AmqpReceivedStamp as LegacyAmqpReceivedStamp; + +/** + * Middleware that throws a RejectRedeliveredMessageException when a message is detected that has been redelivered by AMQP. + * + * The middleware runs before the HandleMessageMiddleware and prevents redelivered messages from being handled directly. + * The thrown exception is caught by the worker and will trigger the retry logic according to the retry strategy. + * + * AMQP redelivers messages when they do not get acknowledged or rejected. This can happen when the connection times out + * or an exception is thrown before acknowledging or rejecting. When such errors happen again while handling the + * redelivered message, the message would get redelivered again and again. The purpose of this middleware is to prevent + * infinite redelivery loops and to unblock the queue by republishing the redelivered messages as retries with a retry + * limit and potential delay. + * + * @author Tobias Schultze + */ +class RejectRedeliveredMessageMiddleware implements MiddlewareInterface +{ + public function handle(Envelope $envelope, StackInterface $stack): Envelope + { + $amqpReceivedStamp = $envelope->last(AmqpReceivedStamp::class); + if ($amqpReceivedStamp instanceof AmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) { + throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.'); + } + + // Legacy code to support symfony/messenger < 5.1 + $amqpReceivedStamp = $envelope->last(LegacyAmqpReceivedStamp::class); + if ($amqpReceivedStamp instanceof LegacyAmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) { + throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.'); + } + + return $stack->next()->handle($envelope, $stack); + } +} diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 381e88c4b8783..ffa6f19eaf558 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -1,6 +1,10 @@ CHANGELOG ========= +5.4 +--- + * Deprecate `Middleware\RejectRedeliveredMessageMiddleware`. Install `symfony/amqp-messenger` and use same class from there. + 5.3 --- diff --git a/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php index 9e994ddd1e01d..934220b76a478 100644 --- a/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php @@ -11,40 +11,9 @@ namespace Symfony\Component\Messenger\Middleware; -use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpReceivedStamp; -use Symfony\Component\Messenger\Envelope; -use Symfony\Component\Messenger\Exception\RejectRedeliveredMessageException; -use Symfony\Component\Messenger\Transport\AmqpExt\AmqpReceivedStamp as LegacyAmqpReceivedStamp; - /** - * Middleware that throws a RejectRedeliveredMessageException when a message is detected that has been redelivered by AMQP. - * - * The middleware runs before the HandleMessageMiddleware and prevents redelivered messages from being handled directly. - * The thrown exception is caught by the worker and will trigger the retry logic according to the retry strategy. - * - * AMQP redelivers messages when they do not get acknowledged or rejected. This can happen when the connection times out - * or an exception is thrown before acknowledging or rejecting. When such errors happen again while handling the - * redelivered message, the message would get redelivered again and again. The purpose of this middleware is to prevent - * infinite redelivery loops and to unblock the queue by republishing the redelivered messages as retries with a retry - * limit and potential delay. - * - * @author Tobias Schultze + * @deprecated since Symfony 5.4, to be removed in 6.0. Use Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware instead. */ -class RejectRedeliveredMessageMiddleware implements MiddlewareInterface +class RejectRedeliveredMessageMiddleware extends \Symfony\Component\Messenger\Bridge\Amqp\Middleware\RejectRedeliveredMessageMiddleware { - public function handle(Envelope $envelope, StackInterface $stack): Envelope - { - $amqpReceivedStamp = $envelope->last(AmqpReceivedStamp::class); - if ($amqpReceivedStamp instanceof AmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) { - throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.'); - } - - // Legacy code to support symfony/messenger < 5.1 - $amqpReceivedStamp = $envelope->last(LegacyAmqpReceivedStamp::class); - if ($amqpReceivedStamp instanceof LegacyAmqpReceivedStamp && $amqpReceivedStamp->getAmqpEnvelope()->isRedelivery()) { - throw new RejectRedeliveredMessageException('Redelivered message from AMQP detected that will be rejected and trigger the retry logic.'); - } - - return $stack->next()->handle($envelope, $stack); - } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy