Skip to content

Commit 8bf5ce9

Browse files
authored
Merge pull request #815 from php-enqueue/fix-dbal-requeue
[dbal] Fix DBAL Consumer duplicating messages when rejecting with requeue
2 parents 947eb72 + 270aa28 commit 8bf5ce9

3 files changed

Lines changed: 28 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/DbalConsumerTest.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ public function testRejectShouldReSendMessageToSameQueueOnRequeue()
169169

170170
$message = new DbalMessage();
171171
$message->setBody('theBody');
172+
$message->setDeliveryId(__METHOD__);
172173

173174
$producerMock = $this->createProducerMock();
174175
$producerMock

‎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 testShouldRemoveOriginalMessageThatHaveBeenRejectedWithRequeue()
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->assertSame(1, $this->getQuerySize());
164+
165+
$message = $consumer->receive(100); // 100ms
166+
167+
$this->assertInstanceOf(DbalMessage::class, $message);
168+
$consumer->reject($message, true);
169+
$this->assertSame(1, $this->getQuerySize());
170+
}
171+
147172
private function getQuerySize(): int
148173
{
149174
return (int) $this->context->getDbalConnection()

0 commit comments

Comments
 (0)