From f9b32609fceaefbefb7d1b5297dbab9850d6de43 Mon Sep 17 00:00:00 2001 From: Michael Sheakoski Date: Sat, 3 Mar 2018 17:03:17 -0500 Subject: [PATCH 1/2] Convert between Message::$expire and DbalMessage::$timeToLive Fixes a condition which results in the "enqueue" table having a null value for "time_to_live" even though it was set on the Message object prior to sending the event/command. --- pkg/dbal/Client/DbalDriver.php | 3 +++ pkg/dbal/Tests/Client/DbalDriverTest.php | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/dbal/Client/DbalDriver.php b/pkg/dbal/Client/DbalDriver.php index d5fd9a5a2..2f98b2978 100644 --- a/pkg/dbal/Client/DbalDriver.php +++ b/pkg/dbal/Client/DbalDriver.php @@ -72,6 +72,7 @@ public function createTransportMessage(Message $message) $transportMessage->setMessageId($message->getMessageId()); $transportMessage->setTimestamp($message->getTimestamp()); $transportMessage->setDeliveryDelay($message->getDelay()); + $transportMessage->setTimeToLive($message->getExpire()); $transportMessage->setReplyTo($message->getReplyTo()); $transportMessage->setCorrelationId($message->getCorrelationId()); if (array_key_exists($message->getPriority(), self::$priorityMap)) { @@ -97,6 +98,8 @@ public function createClientMessage(PsrMessage $message) $clientMessage->setContentType($message->getHeader('content_type')); $clientMessage->setMessageId($message->getMessageId()); $clientMessage->setTimestamp($message->getTimestamp()); + $timeToLive = $message->getTimeToLive(); + $clientMessage->setExpire((null === $timeToLive) ? null : (int) round($timeToLive)); $clientMessage->setDelay($message->getDeliveryDelay()); $clientMessage->setReplyTo($message->getReplyTo()); $clientMessage->setCorrelationId($message->getCorrelationId()); diff --git a/pkg/dbal/Tests/Client/DbalDriverTest.php b/pkg/dbal/Tests/Client/DbalDriverTest.php index 6c8de2016..dbdcaa2d8 100644 --- a/pkg/dbal/Tests/Client/DbalDriverTest.php +++ b/pkg/dbal/Tests/Client/DbalDriverTest.php @@ -94,6 +94,7 @@ public function testShouldConvertTransportMessageToClientMessage() $transportMessage->setTimestamp(1000); $transportMessage->setPriority(2); $transportMessage->setDeliveryDelay(12345); + $transportMessage->setTimeToLive(67890); $driver = new DbalDriver( $this->createPsrContextMock(), @@ -118,11 +119,29 @@ public function testShouldConvertTransportMessageToClientMessage() $this->assertSame('ContentType', $clientMessage->getContentType()); $this->assertSame(1000, $clientMessage->getTimestamp()); $this->assertSame(12345, $clientMessage->getDelay()); - - $this->assertNull($clientMessage->getExpire()); + $this->assertSame(67890, $clientMessage->getExpire()); $this->assertSame(MessagePriority::NORMAL, $clientMessage->getPriority()); } + public function testShouldRoundTransportMessageTimeToLiveToNearestIntegerWhenConvertingToClientMessage() + { + $driver = new DbalDriver( + $this->createPsrContextMock(), + $this->createDummyConfig(), + $this->createDummyQueueMetaRegistry() + ); + + $transportMessage = new DbalMessage(); + + $transportMessage->setTimeToLive(1.4); + $clientMessage = $driver->createClientMessage($transportMessage); + $this->assertSame(1, $clientMessage->getExpire()); + + $transportMessage->setTimeToLive(1.5); + $clientMessage = $driver->createClientMessage($transportMessage); + $this->assertSame(2, $clientMessage->getExpire()); + } + public function testShouldConvertClientMessageToTransportMessage() { $clientMessage = new Message(); @@ -163,6 +182,7 @@ public function testShouldConvertClientMessageToTransportMessage() $this->assertSame([ 'key' => 'val', ], $transportMessage->getProperties()); + $this->assertSame(123, $transportMessage->getTimeToLive()); $this->assertSame('MessageId', $transportMessage->getMessageId()); $this->assertSame(1000, $transportMessage->getTimestamp()); } From 640024d490670445f94bae48053826ac6ed20a66 Mon Sep 17 00:00:00 2001 From: Maksim Kotlyar Date: Mon, 13 Aug 2018 15:37:49 +0300 Subject: [PATCH 2/2] [BC break][dbal] Convert EnqueueClient expire to Dbal time to live and back. --- pkg/dbal/Client/DbalDriver.php | 15 +++++++++++---- pkg/dbal/DbalConsumer.php | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/pkg/dbal/Client/DbalDriver.php b/pkg/dbal/Client/DbalDriver.php index 2f98b2978..34da95208 100644 --- a/pkg/dbal/Client/DbalDriver.php +++ b/pkg/dbal/Client/DbalDriver.php @@ -71,8 +71,12 @@ public function createTransportMessage(Message $message) $transportMessage->setProperties($properties); $transportMessage->setMessageId($message->getMessageId()); $transportMessage->setTimestamp($message->getTimestamp()); - $transportMessage->setDeliveryDelay($message->getDelay()); - $transportMessage->setTimeToLive($message->getExpire()); + + $delay = $message->getDelay(); + $transportMessage->setDeliveryDelay((null === $delay) ? null : ($delay * 1000)); + + $timeToLive = $message->getExpire(); + $transportMessage->setTimeToLive((null === $timeToLive) ? null : ($timeToLive * 1000)); $transportMessage->setReplyTo($message->getReplyTo()); $transportMessage->setCorrelationId($message->getCorrelationId()); if (array_key_exists($message->getPriority(), self::$priorityMap)) { @@ -98,9 +102,12 @@ public function createClientMessage(PsrMessage $message) $clientMessage->setContentType($message->getHeader('content_type')); $clientMessage->setMessageId($message->getMessageId()); $clientMessage->setTimestamp($message->getTimestamp()); + $timeToLive = $message->getTimeToLive(); - $clientMessage->setExpire((null === $timeToLive) ? null : (int) round($timeToLive)); - $clientMessage->setDelay($message->getDeliveryDelay()); + $clientMessage->setExpire((null === $timeToLive) ? null : (int) ($timeToLive / 1000)); + + $delay = $message->getDeliveryDelay(); + $clientMessage->setDelay((null === $delay) ? null : (int) ($delay / 1000)); $clientMessage->setReplyTo($message->getReplyTo()); $clientMessage->setCorrelationId($message->getCorrelationId()); diff --git a/pkg/dbal/DbalConsumer.php b/pkg/dbal/DbalConsumer.php index b58d30c2d..2a687fedd 100644 --- a/pkg/dbal/DbalConsumer.php +++ b/pkg/dbal/DbalConsumer.php @@ -163,7 +163,7 @@ protected function receiveMessage() $this->dbal->commit(); - if (empty($dbalMessage['time_to_live']) || $dbalMessage['time_to_live'] > time()) { + if (empty($dbalMessage['time_to_live']) || ($dbalMessage['time_to_live'] / 1000) > microtime(true)) { return $this->convertMessage($dbalMessage); } } catch (\Exception $e) {