Skip to content

Commit 1486fe2

Browse files
authored
Merge pull request #852 from deguif/sqs-requeue-visibility-timeout
[SQS] Requeue with a visibility timeout
2 parents 0c9f7c4 + c8d78f2 commit 1486fe2

3 files changed

Lines changed: 63 additions & 1 deletion

File tree

‎pkg/sqs/SqsConsumer.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public function reject(Message $message, bool $requeue = false): void
138138
'@region' => $this->queue->getRegion(),
139139
'QueueUrl' => $this->context->getQueueUrl($this->queue),
140140
'ReceiptHandle' => $message->getReceiptHandle(),
141-
'VisibilityTimeout' => 0,
141+
'VisibilityTimeout' => $message->getRequeueVisibilityTimeout(),
142142
]);
143143
} else {
144144
$this->context->getSqsClient()->deleteMessage([

‎pkg/sqs/SqsMessage.php‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,19 @@ class SqsMessage implements Message
4848
*/
4949
private $receiptHandle;
5050

51+
/**
52+
* @var int
53+
*/
54+
private $requeueVisibilityTimeout;
55+
5156
public function __construct(string $body = '', array $properties = [], array $headers = [])
5257
{
5358
$this->body = $body;
5459
$this->properties = $properties;
5560
$this->headers = $headers;
5661
$this->redelivered = false;
5762
$this->delaySeconds = 0;
63+
$this->requeueVisibilityTimeout = 0;
5864
}
5965

6066
public function setBody(string $body): void
@@ -229,4 +235,19 @@ public function getReceiptHandle(): ?string
229235
{
230236
return $this->receiptHandle;
231237
}
238+
239+
/**
240+
* The number of seconds before the message can be visible again when requeuing. Valid values: 0 to 43200. Maximum: 12 hours.
241+
*
242+
* Set requeue visibility timeout
243+
*/
244+
public function setRequeueVisibilityTimeout(int $seconds): void
245+
{
246+
$this->requeueVisibilityTimeout = $seconds;
247+
}
248+
249+
public function getRequeueVisibilityTimeout(): int
250+
{
251+
return $this->requeueVisibilityTimeout;
252+
}
232253
}

‎pkg/sqs/Tests/SqsConsumerTest.php‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,47 @@ public function testShouldRejectMessageAndRequeue()
238238
$consumer->reject($message, true);
239239
}
240240

241+
public function testShouldRejectMessageAndRequeueWithVisibilityTimeout()
242+
{
243+
$client = $this->createSqsClientMock();
244+
$client
245+
->expects($this->once())
246+
->method('changeMessageVisibility')
247+
->with($this->identicalTo([
248+
'@region' => 'theRegion',
249+
'QueueUrl' => 'theQueueUrl',
250+
'ReceiptHandle' => 'theReceipt',
251+
'VisibilityTimeout' => 30,
252+
]))
253+
;
254+
255+
$context = $this->createContextMock();
256+
$context
257+
->expects($this->once())
258+
->method('getSqsClient')
259+
->willReturn($client)
260+
;
261+
$context
262+
->expects($this->once())
263+
->method('getQueueUrl')
264+
->willReturn('theQueueUrl')
265+
;
266+
$context
267+
->expects($this->never())
268+
->method('createProducer')
269+
;
270+
271+
$message = new SqsMessage();
272+
$message->setReceiptHandle('theReceipt');
273+
$message->setRequeueVisibilityTimeout(30);
274+
275+
$destination = new SqsDestination('queue');
276+
$destination->setRegion('theRegion');
277+
278+
$consumer = new SqsConsumer($context, $destination);
279+
$consumer->reject($message, true);
280+
}
281+
241282
public function testShouldReceiveMessage()
242283
{
243284
$expectedAttributes = [

0 commit comments

Comments
 (0)