Skip to content

Commit a4c8f4e

Browse files
committed
bug #45910 [Messenger] reset connection on worker shutdown (SanderHagen)
This PR was squashed before being merged into the 4.4 branch. Discussion ---------- [Messenger] reset connection on worker shutdown | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | Fix #45778 | License | MIT As seen in the issue. Amazon SQS transport uses a buffer. Messages can be lost when the buffer contains these messages and some container executing the process is shut down. The connection contains a [reset](https://github.com/symfony/amazon-sqs-messenger/blob/5.4/Transport/Connection.php#L366) method and implements the `ResetInterface`. If this method were to be called on shutdown the messages will be marked as visible again. Commits ------- c486305 [Messenger] reset connection on worker shutdown
2 parents f0fde2f + c486305 commit a4c8f4e

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

src/Symfony/Component/Messenger/Tests/WorkerTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
3030
use Symfony\Component\Messenger\Worker;
3131
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
32+
use Symfony\Contracts\Service\ResetInterface;
3233

3334
/**
3435
* @group time-sensitive
@@ -85,6 +86,19 @@ public function testHandlingErrorCausesReject()
8586
$this->assertSame(0, $receiver->getAcknowledgeCount());
8687
}
8788

89+
public function testWorkerResetsConnectionIfReceiverIsResettable()
90+
{
91+
$resettableReceiver = new ResettableDummyReceiver([]);
92+
93+
$bus = $this->createMock(MessageBusInterface::class);
94+
$dispatcher = new EventDispatcher();
95+
96+
$worker = new Worker([$resettableReceiver], $bus, $dispatcher);
97+
$worker->stop();
98+
$worker->run();
99+
$this->assertTrue($resettableReceiver->hasBeenReset());
100+
}
101+
88102
public function testWorkerDoesNotSendNullMessagesToTheBus()
89103
{
90104
$receiver = new DummyReceiver([
@@ -283,3 +297,18 @@ public function getRejectCount(): int
283297
return $this->rejectCount;
284298
}
285299
}
300+
301+
class ResettableDummyReceiver extends DummyReceiver implements ResetInterface
302+
{
303+
private $hasBeenReset = false;
304+
305+
public function reset()
306+
{
307+
$this->hasBeenReset = true;
308+
}
309+
310+
public function hasBeenReset(): bool
311+
{
312+
return $this->hasBeenReset;
313+
}
314+
}

src/Symfony/Component/Messenger/Worker.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
2626
use Symfony\Component\Messenger\Transport\Receiver\ReceiverInterface;
2727
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
28+
use Symfony\Contracts\Service\ResetInterface;
2829

2930
/**
3031
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -102,6 +103,7 @@ public function run(array $options = []): void
102103
}
103104

104105
$this->dispatchEvent(new WorkerStoppedEvent($this));
106+
$this->resetReceiverConnections();
105107
}
106108

107109
private function handleMessage(Envelope $envelope, ReceiverInterface $receiver, string $transportName): void
@@ -155,6 +157,15 @@ public function stop(): void
155157
$this->shouldStop = true;
156158
}
157159

160+
private function resetReceiverConnections(): void
161+
{
162+
foreach ($this->receivers as $transportName => $receiver) {
163+
if ($receiver instanceof ResetInterface) {
164+
$receiver->reset();
165+
}
166+
}
167+
}
168+
158169
private function dispatchEvent($event)
159170
{
160171
if (null === $this->eventDispatcher) {

0 commit comments

Comments
 (0)
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