Skip to content

Commit 421e6cf

Browse files
committed
Fix DBAL Consumer duplicating messages when rejecting with requeue
1 parent 947eb72 commit 421e6cf

2 files changed

Lines changed: 27 additions & 4 deletions

File tree

‎pkg/dbal/DbalConsumer.php‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,14 @@ public function reject(Message $message, bool $requeue = false): void
100100
{
101101
InvalidMessageException::assertMessageInstanceOf($message, DbalMessage::class);
102102

103+
$this->acknowledge($message);
104+
103105
if ($requeue) {
104106
$message = clone $message;
105107
$message->setRedelivered(false);
106108

107109
$this->getContext()->createProducer()->send($this->queue, $message);
108-
109-
return;
110110
}
111-
112-
$this->deleteMessage($message->getDeliveryId());
113111
}
114112

115113
protected function getContext(): DbalContext

‎pkg/dbal/Tests/Functional/DbalConsumerTest.php‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,31 @@ public function testShouldDeleteExpiredMessage()
144144
$this->assertSame(0, $this->getQuerySize());
145145
}
146146

147+
public function testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeu()
148+
{
149+
$context = $this->context;
150+
$queue = $context->createQueue(__METHOD__);
151+
152+
$consumer = $context->createConsumer($queue);
153+
154+
// guard
155+
$this->assertSame(0, $this->getQuerySize());
156+
157+
$producer = $context->createProducer();
158+
159+
/** @var DbalMessage $message */
160+
$message = $context->createMessage(__CLASS__);
161+
$producer->send($queue, $message);
162+
163+
$this->assertCount(1, $this->getQuerySize());
164+
165+
$message = $consumer->receive(100); // 100ms
166+
167+
$this->assertInstanceOf(DbalMessage::class, $message);
168+
$consumer->reject($message, true);
169+
$this->assertCount(1, $this->getQuerySize());
170+
}
171+
147172
private function getQuerySize(): int
148173
{
149174
return (int) $this->context->getDbalConnection()

0 commit comments

Comments
 (0)