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

Skip to content

Commit 80fed8f

Browse files
committed
Catches failed retries and forward other messages' attributes
1 parent 4ae654b commit 80fed8f

File tree

6 files changed

+47
-9
lines changed

6 files changed

+47
-9
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
<argument type="service" id="messenger.transport.encoder" />
6969
<argument type="service" id="messenger.transport.decoder" />
7070
<argument>%kernel.debug%</argument>
71+
<argument type="service" id="logger" on-invalid="null" />
7172

7273
<tag name="messenger.transport_factory" />
7374
</service>

src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/AmqpTransportFactoryTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function testItCreatesTheTransport()
4141
true
4242
);
4343

44-
$expectedTransport = new AmqpTransport($encoder, $decoder, Connection::fromDsn('amqp://localhost', array('foo' => 'bar'), true), array('foo' => 'bar'), true);
44+
$expectedTransport = new AmqpTransport($encoder, $decoder, Connection::fromDsn('amqp://localhost', array('foo' => 'bar'), true));
4545

4646
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', array('foo' => 'bar')));
4747
}

src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpReceiver.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Transport\AmqpExt;
1313

14+
use Psr\Log\LoggerInterface;
1415
use Symfony\Component\Messenger\Transport\AmqpExt\Exception\RejectMessageExceptionInterface;
1516
use Symfony\Component\Messenger\Transport\ReceiverInterface;
1617
use Symfony\Component\Messenger\Transport\Serialization\DecoderInterface;
@@ -24,12 +25,14 @@ class AmqpReceiver implements ReceiverInterface
2425
{
2526
private $decoder;
2627
private $connection;
28+
private $logger;
2729
private $shouldStop;
2830

29-
public function __construct(DecoderInterface $decoder, Connection $connection)
31+
public function __construct(DecoderInterface $decoder, Connection $connection, LoggerInterface $logger = null)
3032
{
3133
$this->decoder = $decoder;
3234
$this->connection = $connection;
35+
$this->logger = $logger;
3336
}
3437

3538
/**
@@ -63,7 +66,18 @@ public function receive(callable $handler): void
6366

6467
throw $e;
6568
} catch (\Throwable $e) {
66-
if (!$this->connection->publishForRetry($AMQPEnvelope)) {
69+
try {
70+
$retried = $this->connection->publishForRetry($AMQPEnvelope);
71+
} catch (\Throwable $retryException) {
72+
$this->logger && $this->logger->warning(sprintf('Retrying message #%s failed. Requeuing it now.', $AMQPEnvelope->getMessageId()), array(
73+
'retryException' => $retryException,
74+
'exception' => $e,
75+
));
76+
77+
$retried = false;
78+
}
79+
80+
if (!$retried) {
6781
$this->connection->nack($AMQPEnvelope, AMQP_REQUEUE);
6882

6983
throw $e;

src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpTransport.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Transport\AmqpExt;
1313

14+
use Psr\Log\LoggerInterface;
1415
use Symfony\Component\Messenger\Envelope;
1516
use Symfony\Component\Messenger\Transport\Serialization\DecoderInterface;
1617
use Symfony\Component\Messenger\Transport\Serialization\EncoderInterface;
@@ -26,12 +27,14 @@ class AmqpTransport implements TransportInterface
2627
private $connection;
2728
private $receiver;
2829
private $sender;
30+
private $logger;
2931

30-
public function __construct(EncoderInterface $encoder, DecoderInterface $decoder, Connection $connection)
32+
public function __construct(EncoderInterface $encoder, DecoderInterface $decoder, Connection $connection, LoggerInterface $logger = null)
3133
{
3234
$this->encoder = $encoder;
3335
$this->decoder = $decoder;
3436
$this->connection = $connection;
37+
$this->logger = $logger;
3538
}
3639

3740
/**
@@ -60,7 +63,7 @@ public function send(Envelope $envelope): void
6063

6164
private function getReceiver()
6265
{
63-
return $this->receiver = new AmqpReceiver($this->decoder, $this->connection);
66+
return $this->receiver = new AmqpReceiver($this->decoder, $this->connection, $this->logger);
6467
}
6568

6669
private function getSender()

src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpTransportFactory.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Messenger\Transport\AmqpExt;
1313

14+
use Psr\Log\LoggerInterface;
1415
use Symfony\Component\Messenger\Transport\Serialization\DecoderInterface;
1516
use Symfony\Component\Messenger\Transport\Serialization\EncoderInterface;
1617
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
@@ -24,17 +25,19 @@ class AmqpTransportFactory implements TransportFactoryInterface
2425
private $encoder;
2526
private $decoder;
2627
private $debug;
28+
private $logger;
2729

28-
public function __construct(EncoderInterface $encoder, DecoderInterface $decoder, bool $debug)
30+
public function __construct(EncoderInterface $encoder, DecoderInterface $decoder, bool $debug, LoggerInterface $logger = null)
2931
{
3032
$this->encoder = $encoder;
3133
$this->decoder = $decoder;
3234
$this->debug = $debug;
35+
$this->logger = $logger;
3336
}
3437

3538
public function createTransport(string $dsn, array $options): TransportInterface
3639
{
37-
return new AmqpTransport($this->encoder, $this->decoder, Connection::fromDsn($dsn, $options, $this->debug));
40+
return new AmqpTransport($this->encoder, $this->decoder, Connection::fromDsn($dsn, $options, $this->debug), $this->logger);
3841
}
3942

4043
public function supports(string $dsn, array $options): bool

src/Symfony/Component/Messenger/Transport/AmqpExt/Connection.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,28 @@ public function publishForRetry(\AMQPEnvelope $message): bool
169169
$routingKey = $retryConfiguration['dead_routing_key'];
170170
}
171171

172+
$retriedMessageAttributes = array(
173+
'headers' => array_merge($message->getHeaders(), array('symfony-messenger-attempts' => (string) $attemptNumber)),
174+
);
175+
176+
if ($deliveryMode = $message->getDeliveryMode()) {
177+
$retriedMessageAttributes['delivery_mode'] = $deliveryMode;
178+
}
179+
if ($userId = $message->getUserId()) {
180+
$retriedMessageAttributes['user_id'] = $userId;
181+
}
182+
if (null !== $priority = $message->getPriority()) {
183+
$retriedMessageAttributes['priority'] = $priority;
184+
}
185+
if ($replyTo = $message->getReplyTo()) {
186+
$retriedMessageAttributes['reply_to'] = $replyTo;
187+
}
188+
172189
$this->retryExchange($retryConfiguration)->publish(
173190
$message->getBody(),
174191
$routingKey,
175192
AMQP_NOPARAM,
176-
array('headers' => array_merge($message->getHeaders(), array('symfony-messenger-attempts' => (string) $attemptNumber)))
193+
$retriedMessageAttributes
177194
);
178195

179196
return true;
@@ -200,7 +217,7 @@ private function setupRetry(array $retryConfiguration, int $attemptNumber)
200217
}
201218
}
202219

203-
private function retryExchange(array $retryConfiguration)
220+
private function retryExchange(array $retryConfiguration): \AMQPExchange
204221
{
205222
if (null === $this->amqpRetryExchange) {
206223
$this->amqpRetryExchange = $this->amqpFactory->createExchange($this->channel());

0 commit comments

Comments
 (0)