Skip to content

Commit 6a5c123

Browse files
[ServiceBus] Consistency review changes as detailed in issue #12415. (#13160)
* Consistency review changes as detailed in issue #12415. * significant amount of renames, parameter removal, mgmt shim class building, and a few added capabilities in terms of renew_lock retval and receive_deferred param acceptance. * Update mgmt test recordings Co-authored-by: Adam Ling (MSFT) <[email protected]>
1 parent 0c5ecad commit 6a5c123

File tree

127 files changed

+6324
-3544
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+6324
-3544
lines changed

sdk/servicebus/azure-servicebus/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,25 @@
33
## 7.0.0b6 (Unreleased)
44

55
**New Features**
6+
7+
* `renew_lock()` now returns the UTC datetime that the lock is set to expire at.
8+
* `receive_deferred_messages()` can now take a single sequence number as well as a list of sequence numbers.
69
* Messages can now be sent twice in succession.
710
* Internal AMQP message properties (header, footer, annotations, properties, etc) are now exposed via `Message.amqp_message`
811

912
**Breaking Changes**
1013

14+
* Renamed `prefetch` to `prefetch_count`.
15+
* Renamed `ReceiveSettleMode` enum to `ReceiveMode`, and respectively the `mode` parameter to `receive_mode`.
16+
* `retry_total`, `retry_backoff_factor` and `retry_backoff_max` are now defined at the `ServiceBusClient` level and inherited by senders and receivers created from it.
17+
* No longer export `NEXT_AVAILABLE` in `azure.servicebus` module. A null `session_id` will suffice.
18+
* Renamed parameter `message_count` to `max_message_count` as fewer messages may be present for method `peek_messages()` and `receive_messages()`.
19+
* Renamed `PeekMessage` to `PeekedMessage`.
20+
* Renamed `get_session_state()` and `set_session_state()` to `get_state()` and `set_state()` accordingly.
21+
* Renamed parameter `description` to `error_description` for method `dead_letter()`.
22+
* Renamed properties `created_time` and `modified_time` to `created_at_utc` and `modified_at_utc` within `AuthorizationRule` and `NamespaceProperties`.
23+
* Removed parameter `requires_preprocessing` from `SqlRuleFilter` and `SqlRuleAction`.
24+
* Removed property `namespace_type` from `NamespaceProperties`.
1125
* Rename `ServiceBusManagementClient` to `ServiceBusAdministrationClient`
1226
* Attempting to call `send_messages` on something not a `Message`, `BatchMessage`, or list of `Message`s, will now throw a `TypeError` instead of `ValueError`
1327
* Sending a message twice will no longer result in a MessageAlreadySettled exception.

sdk/servicebus/azure-servicebus/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,13 @@ with ServiceBusClient.from_connection_string(connstr) as client:
171171
if received_message_array:
172172
print(str(received_message_array[0]))
173173

174-
with client.get_queue_receiver(queue_name, prefetch=5) as receiver:
175-
received_message_array = receiver.receive_messages(max_batch_size=5, max_wait_time=10) # try to receive maximum 5 messages in a batch within 10 seconds
174+
with client.get_queue_receiver(queue_name) as receiver:
175+
received_message_array = receiver.receive_messages(max_message_count=5, max_wait_time=10) # try to receive maximum 5 messages in a batch within 10 seconds
176176
for message in received_message_array:
177177
print(str(message))
178178
```
179179

180-
In this example, max_batch_size (and prefetch, as required by max_batch_size) declares the maximum number of messages to attempt receiving before hitting a max_wait_time as specified in seconds.
180+
In this example, max_message_count declares the maximum number of messages to attempt receiving before hitting a max_wait_time as specified in seconds.
181181

182182
> **NOTE:** It should also be noted that `ServiceBusReceiver.peek_messages()` is subtly different than receiving, as it does not lock the messages being peeked, and thus they cannot be settled.
183183
@@ -235,8 +235,8 @@ with ServiceBusClient.from_connection_string(connstr) as client:
235235

236236
When receiving from a queue, you have multiple actions you can take on the messages you receive.
237237

238-
> **NOTE**: You can only settle `ReceivedMessage` objects which are received in `ReceiveSettleMode.PeekLock` mode (this is the default).
239-
> `ReceiveSettleMode.ReceiveAndDelete` mode removes the message from the queue on receipt. `PeekMessage` messages
238+
> **NOTE**: You can only settle `ReceivedMessage` objects which are received in `ReceiveMode.PeekLock` mode (this is the default).
239+
> `ReceiveMode.ReceiveAndDelete` mode removes the message from the queue on receipt. `PeekedMessage` messages
240240
> returned from `peek()` cannot be settled, as the message lock is not taken like it is in the aforementioned receive methods. Sessionful messages have a similar limitation.
241241
242242
If the message has a lock as mentioned above, settlement will fail if the message lock has expired.

sdk/servicebus/azure-servicebus/azure/servicebus/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@
1414
from ._servicebus_session_receiver import ServiceBusSessionReceiver
1515
from ._servicebus_session import ServiceBusSession
1616
from ._base_handler import ServiceBusSharedKeyCredential
17-
from ._common.message import Message, BatchMessage, PeekMessage, ReceivedMessage
18-
from ._common.constants import ReceiveSettleMode, SubQueue
17+
from ._common.message import Message, BatchMessage, PeekedMessage, ReceivedMessage
18+
from ._common.constants import ReceiveMode, SubQueue
1919
from ._common.auto_lock_renewer import AutoLockRenew
2020

2121
TransportType = constants.TransportType
2222

2323
__all__ = [
2424
'Message',
2525
'BatchMessage',
26-
'PeekMessage',
26+
'PeekedMessage',
2727
'ReceivedMessage',
28-
'ReceiveSettleMode',
2928
'SubQueue',
29+
'ReceiveMode',
3030
'ServiceBusClient',
3131
'ServiceBusReceiver',
3232
'ServiceBusSessionReceiver',

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,16 @@
6262
MGMT_REQUEST_SEQUENCE_NUMBERS = 'sequence-numbers'
6363
MGMT_REQUEST_RECEIVER_SETTLE_MODE = 'receiver-settle-mode'
6464
MGMT_REQUEST_FROM_SEQUENCE_NUMBER = 'from-sequence-number'
65-
MGMT_REQUEST_MESSAGE_COUNT = 'message-count'
65+
MGMT_REQUEST_MAX_MESSAGE_COUNT = 'message-count'
6666
MGMT_REQUEST_MESSAGE = 'message'
6767
MGMT_REQUEST_MESSAGES = 'messages'
6868
MGMT_REQUEST_MESSAGE_ID = 'message-id'
6969
MGMT_REQUEST_PARTITION_KEY = 'partition-key'
7070
MGMT_REQUEST_VIA_PARTITION_KEY = 'via-partition-key'
7171
MGMT_REQUEST_DEAD_LETTER_REASON = 'deadletter-reason'
72-
MGMT_REQUEST_DEAD_LETTER_DESCRIPTION = 'deadletter-description'
72+
MGMT_REQUEST_DEAD_LETTER_ERROR_DESCRIPTION = 'deadletter-description'
7373
RECEIVER_LINK_DEAD_LETTER_REASON = 'DeadLetterReason'
74-
RECEIVER_LINK_DEAD_LETTER_DESCRIPTION = 'DeadLetterErrorDescription'
74+
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION = 'DeadLetterErrorDescription'
7575
MGMT_REQUEST_OP_TYPE_ENTITY_MGMT = b"entity-mgmt"
7676

7777
MESSAGE_COMPLETE = 'complete'
@@ -106,7 +106,7 @@
106106
TRANSFER_DEAD_LETTER_QUEUE_SUFFIX = '/$Transfer' + DEAD_LETTER_QUEUE_SUFFIX
107107

108108

109-
class ReceiveSettleMode(Enum):
109+
class ReceiveMode(Enum):
110110
PeekLock = constants.ReceiverSettleMode.PeekLock
111111
ReceiveAndDelete = constants.ReceiverSettleMode.ReceiveAndDelete
112112

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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
SETTLEMENT_COMPLETE,
2121
SETTLEMENT_DEFER,
2222
SETTLEMENT_DEADLETTER,
23-
ReceiveSettleMode,
23+
ReceiveMode,
2424
_X_OPT_ENQUEUED_TIME,
2525
_X_OPT_SEQUENCE_NUMBER,
2626
_X_OPT_ENQUEUE_SEQUENCE_NUMBER,
@@ -32,9 +32,9 @@
3232
_X_OPT_DEAD_LETTER_SOURCE,
3333
MGMT_RESPONSE_MESSAGE_EXPIRATION,
3434
MGMT_REQUEST_DEAD_LETTER_REASON,
35-
MGMT_REQUEST_DEAD_LETTER_DESCRIPTION,
35+
MGMT_REQUEST_DEAD_LETTER_ERROR_DESCRIPTION,
3636
RECEIVER_LINK_DEAD_LETTER_REASON,
37-
RECEIVER_LINK_DEAD_LETTER_DESCRIPTION,
37+
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION,
3838
MESSAGE_COMPLETE,
3939
MESSAGE_DEAD_LETTER,
4040
MESSAGE_ABANDON,
@@ -577,7 +577,7 @@ def add(self, message):
577577
self._messages.append(message)
578578

579579

580-
class PeekMessage(Message):
580+
class PeekedMessage(Message):
581581
"""A preview message.
582582
583583
This message is still on the queue, and unlocked.
@@ -587,7 +587,7 @@ class PeekMessage(Message):
587587

588588
def __init__(self, message):
589589
# type: (uamqp.message.Message) -> None
590-
super(PeekMessage, self).__init__(None, message=message) # type: ignore
590+
super(PeekedMessage, self).__init__(None, message=message) # type: ignore
591591

592592
def _to_outgoing_message(self):
593593
# type: () -> Message
@@ -736,7 +736,7 @@ def sequence_number(self):
736736
return None
737737

738738

739-
class ReceivedMessageBase(PeekMessage):
739+
class ReceivedMessageBase(PeekedMessage):
740740
"""
741741
A Service Bus Message received from service side.
742742
@@ -753,10 +753,10 @@ class ReceivedMessageBase(PeekMessage):
753753
:caption: Checking the properties on a received message.
754754
"""
755755

756-
def __init__(self, message, mode=ReceiveSettleMode.PeekLock, **kwargs):
757-
# type: (uamqp.message.Message, ReceiveSettleMode, Any) -> None
756+
def __init__(self, message, receive_mode=ReceiveMode.PeekLock, **kwargs):
757+
# type: (uamqp.message.Message, ReceiveMode, Any) -> None
758758
super(ReceivedMessageBase, self).__init__(message=message)
759-
self._settled = (mode == ReceiveSettleMode.ReceiveAndDelete)
759+
self._settled = (receive_mode == ReceiveMode.ReceiveAndDelete)
760760
self._received_timestamp_utc = utc_now()
761761
self._is_deferred_message = kwargs.get("is_deferred_message", False)
762762
self.auto_renew_error = None # type: Optional[Exception]
@@ -765,7 +765,7 @@ def __init__(self, message, mode=ReceiveSettleMode.PeekLock, **kwargs):
765765
except KeyError:
766766
raise TypeError("ReceivedMessage requires a receiver to be initialized. This class should never be" + \
767767
"initialized by a user; the Message class should be utilized instead.")
768-
self._expiry = None
768+
self._expiry = None # type: Optional[datetime.datetime]
769769

770770
def _check_live(self, action):
771771
# pylint: disable=no-member
@@ -784,7 +784,7 @@ def _check_live(self, action):
784784
except AttributeError:
785785
pass
786786

787-
def _settle_via_mgmt_link(self, settle_operation, dead_letter_reason=None, dead_letter_description=None):
787+
def _settle_via_mgmt_link(self, settle_operation, dead_letter_reason=None, dead_letter_error_description=None):
788788
# type: (str, Optional[str], Optional[str]) -> Callable
789789
# pylint: disable=protected-access
790790

@@ -807,7 +807,7 @@ def _settle_via_mgmt_link(self, settle_operation, dead_letter_reason=None, dead_
807807
[self.lock_token],
808808
dead_letter_details={
809809
MGMT_REQUEST_DEAD_LETTER_REASON: dead_letter_reason or "",
810-
MGMT_REQUEST_DEAD_LETTER_DESCRIPTION: dead_letter_description or ""
810+
MGMT_REQUEST_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description or ""
811811
}
812812
)
813813
if settle_operation == MESSAGE_DEFER:
@@ -818,7 +818,7 @@ def _settle_via_mgmt_link(self, settle_operation, dead_letter_reason=None, dead_
818818
)
819819
raise ValueError("Unsupported settle operation type: {}".format(settle_operation))
820820

821-
def _settle_via_receiver_link(self, settle_operation, dead_letter_reason=None, dead_letter_description=None):
821+
def _settle_via_receiver_link(self, settle_operation, dead_letter_reason=None, dead_letter_error_description=None):
822822
# type: (str, Optional[str], Optional[str]) -> Callable
823823
if settle_operation == MESSAGE_COMPLETE:
824824
return functools.partial(self.message.accept)
@@ -828,10 +828,10 @@ def _settle_via_receiver_link(self, settle_operation, dead_letter_reason=None, d
828828
return functools.partial(
829829
self.message.reject,
830830
condition=DEADLETTERNAME,
831-
description=dead_letter_description,
831+
description=dead_letter_error_description,
832832
info={
833833
RECEIVER_LINK_DEAD_LETTER_REASON: dead_letter_reason,
834-
RECEIVER_LINK_DEAD_LETTER_DESCRIPTION: dead_letter_description
834+
RECEIVER_LINK_DEAD_LETTER_ERROR_DESCRIPTION: dead_letter_error_description
835835
}
836836
)
837837
if settle_operation == MESSAGE_DEFER:
@@ -905,15 +905,15 @@ def _settle_message(
905905
self,
906906
settle_operation,
907907
dead_letter_reason=None,
908-
dead_letter_description=None,
908+
dead_letter_error_description=None,
909909
):
910910
# type: (str, Optional[str], Optional[str]) -> None
911911
try:
912912
if not self._is_deferred_message:
913913
try:
914914
self._settle_via_receiver_link(settle_operation,
915915
dead_letter_reason=dead_letter_reason,
916-
dead_letter_description=dead_letter_description)()
916+
dead_letter_error_description=dead_letter_error_description)()
917917
return
918918
except RuntimeError as exception:
919919
_LOGGER.info(
@@ -924,7 +924,7 @@ def _settle_message(
924924
)
925925
self._settle_via_mgmt_link(settle_operation,
926926
dead_letter_reason=dead_letter_reason,
927-
dead_letter_description=dead_letter_description)()
927+
dead_letter_error_description=dead_letter_error_description)()
928928
except Exception as e:
929929
raise MessageSettleFailed(settle_operation, e)
930930

@@ -955,7 +955,7 @@ def complete(self):
955955
self._settle_message(MESSAGE_COMPLETE)
956956
self._settled = True
957957

958-
def dead_letter(self, reason=None, description=None):
958+
def dead_letter(self, reason=None, error_description=None):
959959
# type: (Optional[str], Optional[str]) -> None
960960
"""Move the message to the Dead Letter queue.
961961
@@ -964,7 +964,7 @@ def dead_letter(self, reason=None, description=None):
964964
or processing. The queue can also be configured to send expired messages to the Dead Letter queue.
965965
966966
:param str reason: The reason for dead-lettering the message.
967-
:param str description: The detailed description for dead-lettering the message.
967+
:param str error_description: The detailed error description for dead-lettering the message.
968968
:rtype: None
969969
:raises: ~azure.servicebus.exceptions.MessageAlreadySettled if the message has been settled.
970970
:raises: ~azure.servicebus.exceptions.MessageLockExpired if message lock has already expired.
@@ -983,7 +983,9 @@ def dead_letter(self, reason=None, description=None):
983983
"""
984984
# pylint: disable=protected-access
985985
self._check_live(MESSAGE_DEAD_LETTER)
986-
self._settle_message(MESSAGE_DEAD_LETTER, dead_letter_reason=reason, dead_letter_description=description)
986+
self._settle_message(MESSAGE_DEAD_LETTER,
987+
dead_letter_reason=reason,
988+
dead_letter_error_description=error_description)
987989
self._settled = True
988990

989991
def abandon(self):
@@ -1041,7 +1043,7 @@ def defer(self):
10411043
self._settled = True
10421044

10431045
def renew_lock(self):
1044-
# type: () -> None
1046+
# type: () -> datetime.datetime
10451047
# pylint: disable=protected-access,no-member
10461048
"""Renew the message lock.
10471049
@@ -1057,7 +1059,8 @@ def renew_lock(self):
10571059
Lock renewal can be performed as a background task by registering the message with an
10581060
`azure.servicebus.AutoLockRenew` instance.
10591061
1060-
:rtype: None
1062+
:returns: The utc datetime the lock is set to expire at.
1063+
:rtype: datetime.datetime
10611064
:raises: TypeError if the message is sessionful.
10621065
:raises: ~azure.servicebus.exceptions.MessageLockExpired is message lock has already expired.
10631066
:raises: ~azure.servicebus.exceptions.MessageAlreadySettled is message has already been settled.
@@ -1073,7 +1076,9 @@ def renew_lock(self):
10731076
raise ValueError("Unable to renew lock - no lock token found.")
10741077

10751078
expiry = self._receiver._renew_locks(token) # type: ignore
1076-
self._expiry = utc_from_timestamp(expiry[MGMT_RESPONSE_MESSAGE_EXPIRATION][0]/1000.0)
1079+
self._expiry = utc_from_timestamp(expiry[MGMT_RESPONSE_MESSAGE_EXPIRATION][0]/1000.0) # type: datetime.datetime
1080+
1081+
return self._expiry
10771082

10781083

10791084
class AMQPMessage(object):

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66

77
import uamqp
88

9-
from .message import PeekMessage, ReceivedMessage
9+
from .message import PeekedMessage, ReceivedMessage
1010
from ..exceptions import ServiceBusError, MessageLockExpired
11-
from .constants import ReceiveSettleMode
11+
from .constants import ReceiveMode
1212

1313

1414
def default(status_code, message, description):
@@ -34,7 +34,7 @@ def peek_op(status_code, message, description):
3434
parsed = []
3535
for m in message.get_data()[b'messages']:
3636
wrapped = uamqp.Message.decode_from_bytes(bytearray(m[b'message']))
37-
parsed.append(PeekMessage(wrapped))
37+
parsed.append(PeekedMessage(wrapped))
3838
return parsed
3939
if status_code in [202, 204]:
4040
return []
@@ -63,14 +63,14 @@ def deferred_message_op(
6363
message,
6464
description,
6565
receiver,
66-
mode=ReceiveSettleMode.PeekLock,
66+
receive_mode=ReceiveMode.PeekLock,
6767
message_type=ReceivedMessage
6868
):
6969
if status_code == 200:
7070
parsed = []
7171
for m in message.get_data()[b'messages']:
7272
wrapped = uamqp.Message.decode_from_bytes(bytearray(m[b'message']))
73-
parsed.append(message_type(wrapped, mode, is_deferred_message=True, receiver=receiver))
73+
parsed.append(message_type(wrapped, receive_mode, is_deferred_message=True, receiver=receiver))
7474
return parsed
7575
if status_code in [202, 204]:
7676
return []

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
SESSION_LOCKED_UNTIL,
1313
DATETIMEOFFSET_EPOCH,
1414
MGMT_REQUEST_SESSION_ID,
15-
ReceiveSettleMode
15+
ReceiveMode
1616
)
1717
from ..exceptions import (
1818
_ServiceBusErrorPolicy,
@@ -32,26 +32,26 @@ def _populate_attributes(self, **kwargs):
3232

3333
self._auth_uri = "sb://{}/{}".format(self.fully_qualified_namespace, self.entity_path)
3434
self._entity_uri = "amqps://{}/{}".format(self.fully_qualified_namespace, self.entity_path)
35-
self._mode = kwargs.get("mode", ReceiveSettleMode.PeekLock)
35+
self._receive_mode = kwargs.get("receive_mode", ReceiveMode.PeekLock)
3636
self._error_policy = _ServiceBusErrorPolicy(
3737
max_retries=self._config.retry_total
3838
)
3939
self._name = "SBReceiver-{}".format(uuid.uuid4())
4040
self._last_received_sequenced_number = None
4141
self._message_iter = None
4242
self._connection = kwargs.get("connection")
43-
prefetch = kwargs.get("prefetch", 0)
44-
if int(prefetch) < 0 or int(prefetch) > 50000:
45-
raise ValueError("Prefetch must be an integer between 0 and 50000 inclusive.")
46-
self._prefetch = prefetch + 1
43+
prefetch_count = kwargs.get("prefetch_count", 0)
44+
if int(prefetch_count) < 0 or int(prefetch_count) > 50000:
45+
raise ValueError("prefetch_count must be an integer between 0 and 50000 inclusive.")
46+
self._prefetch_count = prefetch_count + 1
4747
# The relationship between the amount can be received and the time interval is linear: amount ~= perf * interval
48-
# In large max_batch_size case, like 5000, the pull receive would always return hundreds of messages limited by
49-
# the perf and time.
48+
# In large max_message_count case, like 5000, the pull receive would always return hundreds of messages limited
49+
# by the perf and time.
5050
self._further_pull_receive_timeout_ms = 200
5151
self._max_wait_time = kwargs.get("max_wait_time", None)
5252

5353
def _build_message(self, received, message_type=ReceivedMessage):
54-
message = message_type(message=received, mode=self._mode, receiver=self)
54+
message = message_type(message=received, receive_mode=self._receive_mode, receiver=self)
5555
self._last_received_sequenced_number = message.sequence_number
5656
return message
5757

0 commit comments

Comments
 (0)