Skip to content

Commit 0beb156

Browse files
authored
[Service Bus] calculate absolute expiry time based on time to live (#18289)
* update absolute expiry time * remove unused import * .\message.py
1 parent 8a82839 commit 0beb156

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

sdk/servicebus/azure-servicebus/azure/servicebus/_common/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@
161161

162162

163163
MESSAGE_PROPERTY_MAX_LENGTH = 128
164+
# .NET TimeSpan.MaxValue: 10675199.02:48:05.4775807
165+
MAX_DURATION_VALUE = 922337203685477
166+
# equivalent to .NET Date("9999-12-31T07:59:59.000Z").getTime() in ms
167+
MAX_ABSOLUTE_EXPIRY_TIME = 253402243199000
164168

165169

166170
class ServiceBusReceiveMode(str, Enum):

sdk/servicebus/azure-servicebus/azure/servicebus/_common/message.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# -------------------------------------------------------------------------
66
# pylint: disable=too-many-lines
77

8+
import time
89
import datetime
910
import uuid
1011
import logging
@@ -34,6 +35,8 @@
3435
ANNOTATION_SYMBOL_SCHEDULED_ENQUEUE_TIME,
3536
ANNOTATION_SYMBOL_KEY_MAP,
3637
MESSAGE_PROPERTY_MAX_LENGTH,
38+
MAX_ABSOLUTE_EXPIRY_TIME,
39+
MAX_DURATION_VALUE
3740
)
3841

3942
from ..exceptions import MessageSizeExceededError
@@ -277,11 +280,20 @@ def time_to_live(self, value):
277280
self._amqp_header = uamqp.message.MessageHeader()
278281
if value is None:
279282
self._amqp_header.time_to_live = value
283+
if self._amqp_properties.absolute_expiry_time:
284+
self._amqp_properties.absolute_expiry_time = value
280285
elif isinstance(value, datetime.timedelta):
281286
self._amqp_header.time_to_live = value.seconds * 1000
282287
else:
283288
self._amqp_header.time_to_live = int(value) * 1000
284289

290+
if self._amqp_header.time_to_live and self._amqp_header.time_to_live != MAX_DURATION_VALUE:
291+
self._amqp_properties.creation_time = int(time.mktime(utc_now().timetuple()))
292+
self._amqp_properties.absolute_expiry_time = min(
293+
MAX_ABSOLUTE_EXPIRY_TIME,
294+
self._amqp_properties.creation_time + self._amqp_header.time_to_live
295+
)
296+
285297
@property
286298
def scheduled_enqueue_time_utc(self):
287299
# type: () -> Optional[datetime.datetime]

sdk/servicebus/azure-servicebus/tests/test_queues.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,7 @@ def message_content():
12631263
message.to = 'to'
12641264
message.reply_to = 'reply_to'
12651265
message.time_to_live = timedelta(seconds=60)
1266+
assert message._amqp_properties.absolute_expiry_time == message._amqp_properties.creation_time + message._amqp_header.time_to_live
12661267

12671268
yield message
12681269

0 commit comments

Comments
 (0)