async def receive_deferred_messages( self, sequence_numbers: Union[int, List[int]], **kwargs: Any) -> List[ServiceBusReceivedMessage]: """Receive messages that have previously been deferred. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param Union[int, list[int]] sequence_numbers: A list of the sequence numbers of messages that have been deferred. :keyword float timeout: The total operation timeout in seconds including all the retries. The value must be greater than 0 if specified. The default value is None, meaning no timeout. :rtype: list[~azure.servicebus.aio.ServiceBusReceivedMessage] .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py :start-after: [START receive_defer_async] :end-before: [END receive_defer_async] :language: python :dedent: 4 :caption: Receive deferred messages from ServiceBus. """ self._check_live() timeout = kwargs.pop("timeout", None) if timeout is not None and timeout <= 0: raise ValueError("The timeout must be greater than 0.") if isinstance(sequence_numbers, six.integer_types): sequence_numbers = [sequence_numbers] if not sequence_numbers: raise ValueError("At least one sequence number must be specified.") await self._open() try: receive_mode = self._receive_mode.value.value except AttributeError: receive_mode = int(self._receive_mode) message = { MGMT_REQUEST_SEQUENCE_NUMBERS: types.AMQPArray([types.AMQPLong(s) for s in sequence_numbers]), MGMT_REQUEST_RECEIVER_SETTLE_MODE: types.AMQPuInt(receive_mode) } self._populate_message_properties(message) handler = functools.partial(mgmt_handlers.deferred_message_op, receive_mode=self._receive_mode, message_type=ServiceBusReceivedMessage, receiver=self) messages = await self._mgmt_request_response_with_retry( REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, handler, timeout=timeout) if self._auto_lock_renewer and not self._session: for message in messages: self._auto_lock_renewer.register(self, message) return messages
async def receive_deferred_messages(self, sequence_numbers, mode=ReceiveSettleMode.PeekLock, **kwargs): """Receive messages that have previously been deferred. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param sequence_numbers: A list of the sequence numbers of messages that have been deferred. :type sequence_numbers: list[int] :param mode: The mode with which messages will be retrieved from the entity. The two options are PeekLock and ReceiveAndDelete. Messages received with PeekLock must be settled within a given lock period before they will be removed from the queue. Messages received with ReceiveAndDelete will be immediately removed from the queue, and cannot be subsequently rejected or re-received if the client fails to process the message. The default mode is PeekLock. :type mode: ~azure.servicebus.common.constants.ReceiveSettleMode :rtype: list[~azure.servicebus.aio.async_message.DeferredMessage] Example: .. literalinclude:: ../examples/async_examples/test_examples_async.py :start-after: [START client_defer_messages] :end-before: [END client_defer_messages] :language: python :dedent: 8 :caption: Defer messages, then retrieve them by sequence number. """ if (self.entity and self.requires_session) or kwargs.get('session'): raise ValueError( "Sessionful deferred messages can only be received within a locked receive session." ) if not sequence_numbers: raise ValueError("At least one sequence number must be specified.") try: receive_mode = mode.value.value except AttributeError: receive_mode = int(mode) message = { 'sequence-numbers': types.AMQPArray([types.AMQPLong(s) for s in sequence_numbers]), 'receiver-settle-mode': types.AMQPuInt(receive_mode) } mgmt_handler = functools.partial(mgmt_handlers.deferred_message_op, mode=receive_mode, message_type=DeferredMessage) async with BaseHandler(self.entity_uri, self.auth_config, loop=self.loop, debug=self.debug, **kwargs) as handler: return await handler._mgmt_request_response( # pylint: disable=protected-access REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, mgmt_handler)
async def receive_deferred_messages(self, sequence_numbers, mode=ReceiveSettleMode.PeekLock): """Receive messages that have previously been deferred. This operation can only receive deferred messages from the current session. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param sequence_numbers: A list of the sequence numbers of messages that have been deferred. :type sequence_numbers: list[int] :param mode: The receive mode, default value is PeekLock. :type mode: ~azure.servicebus.common.constants.ReceiveSettleMode :rtype: list[~azure.servicebus.aio.async_message.DeferredMessage] Example: .. literalinclude:: ../examples/async_examples/test_examples_async.py :start-after: [START receiver_defer_session_messages] :end-before: [END receiver_defer_session_messages] :language: python :dedent: 8 :caption: Defer messages, then retrieve them by sequence number. """ if not sequence_numbers: raise ValueError("At least one sequence number must be specified.") await self._can_run() try: receive_mode = mode.value.value except AttributeError: receive_mode = int(mode) message = { 'sequence-numbers': types.AMQPArray([types.AMQPLong(s) for s in sequence_numbers]), 'receiver-settle-mode': types.AMQPuInt(receive_mode), 'session-id': self.session_id } handler = functools.partial(mgmt_handlers.deferred_message_op, mode=receive_mode, message_type=DeferredMessage) messages = await self._mgmt_request_response( REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, handler) for m in messages: m._receiver = self # pylint: disable=protected-access return messages
async def receive_deferred_messages(self, sequence_numbers): # type: (Union[int, List[int]]) -> List[ReceivedMessage] """Receive messages that have previously been deferred. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param Union[int, list[int]] sequence_numbers: A list of the sequence numbers of messages that have been deferred. :rtype: list[~azure.servicebus.aio.ReceivedMessage] .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py :start-after: [START receive_defer_async] :end-before: [END receive_defer_async] :language: python :dedent: 4 :caption: Receive deferred messages from ServiceBus. """ self._check_live() if isinstance(sequence_numbers, six.integer_types): sequence_numbers = [sequence_numbers] if not sequence_numbers: raise ValueError("At least one sequence number must be specified.") await self._open() try: receive_mode = self._receive_mode.value.value except AttributeError: receive_mode = int(self._receive_mode) message = { MGMT_REQUEST_SEQUENCE_NUMBERS: types.AMQPArray([types.AMQPLong(s) for s in sequence_numbers]), MGMT_REQUEST_RECEIVER_SETTLE_MODE: types.AMQPuInt(receive_mode) } self._populate_message_properties(message) handler = functools.partial(mgmt_handlers.deferred_message_op, receive_mode=self._receive_mode, message_type=ReceivedMessage, receiver=self) messages = await self._mgmt_request_response_with_retry( REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, handler ) return messages
async def receive_deferred_messages(self, sequence_numbers): # type: (List[int]) -> List[ReceivedMessage] """Receive messages that have previously been deferred. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param list[int] sequence_numbers: A list of the sequence numbers of messages that have been deferred. :rtype: list[~azure.servicebus.aio.ReceivedMessage] .. admonition:: Example: .. literalinclude:: ../samples/async_samples/sample_code_servicebus_async.py :start-after: [START receive_defer_async] :end-before: [END receive_defer_async] :language: python :dedent: 4 :caption: Receive deferred messages from ServiceBus. """ self._can_run() if not sequence_numbers: raise ValueError("At least one sequence number must be specified.") await self._open() try: receive_mode = self._mode.value.value except AttributeError: receive_mode = int(self._mode) message = { MGMT_REQUEST_SEQUENCE_NUMBERS: types.AMQPArray([types.AMQPLong(s) for s in sequence_numbers]), MGMT_REQUEST_RECEIVER_SETTLE_MODE: types.AMQPuInt(receive_mode) } if self._session_id: message[MGMT_REQUEST_SESSION_ID] = self._session_id handler = functools.partial(mgmt_handlers.deferred_message_op, mode=self._mode, message_type=ReceivedMessage) messages = await self._mgmt_request_response_with_retry( REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, handler) for m in messages: m._receiver = self # pylint: disable=protected-access return messages
def receive_deferred_messages(self, sequence_numbers, **kwargs): # type: (Union[int,List[int]], Any) -> List[ServiceBusReceivedMessage] """Receive messages that have previously been deferred. When receiving deferred messages from a partitioned entity, all of the supplied sequence numbers must be messages from the same partition. :param Union[int,List[int]] sequence_numbers: A list of the sequence numbers of messages that have been deferred. :keyword Optional[float] timeout: The total operation timeout in seconds including all the retries. The value must be greater than 0 if specified. The default value is None, meaning no timeout. :rtype: List[~azure.servicebus.ServiceBusReceivedMessage] .. admonition:: Example: .. literalinclude:: ../samples/sync_samples/sample_code_servicebus.py :start-after: [START receive_defer_sync] :end-before: [END receive_defer_sync] :language: python :dedent: 4 :caption: Receive deferred messages from ServiceBus. """ self._check_live() timeout = kwargs.pop("timeout", None) if timeout is not None and timeout <= 0: raise ValueError("The timeout must be greater than 0.") if isinstance(sequence_numbers, six.integer_types): sequence_numbers = [sequence_numbers] if len(sequence_numbers) == 0: return [] # no-op on empty list. self._open() uamqp_receive_mode = ServiceBusToAMQPReceiveModeMap[self._receive_mode] try: receive_mode = uamqp_receive_mode.value.value except AttributeError: receive_mode = int(uamqp_receive_mode.value) message = { MGMT_REQUEST_SEQUENCE_NUMBERS: types.AMQPArray( [types.AMQPLong(s) for s in sequence_numbers] ), MGMT_REQUEST_RECEIVER_SETTLE_MODE: types.AMQPuInt(receive_mode), } self._populate_message_properties(message) handler = functools.partial( mgmt_handlers.deferred_message_op, receive_mode=self._receive_mode, receiver=self, ) messages = self._mgmt_request_response_with_retry( REQUEST_RESPONSE_RECEIVE_BY_SEQUENCE_NUMBER, message, handler, timeout=timeout, ) links = get_receive_links(messages) with receive_trace_context_manager( self, span_name=SPAN_NAME_RECEIVE_DEFERRED, links=links ): if ( self._auto_lock_renewer and not self._session and self._receive_mode != ServiceBusReceiveMode.RECEIVE_AND_DELETE ): for message in messages: self._auto_lock_renewer.register(self, message) return messages