2

I have a python service which sends and receives message from azure service bus queue. As per my setup the received will take long time to do some precess and finally completing the message.

To tackle this scenario added auto lock renewal with max_lock_renewal_duration=3600 and set message lock duration as 1 minute.

when i check the log for the first time the lock renewal worked fine but for the second time it errored out. But when i printed the error it just logging the received message not the error.

Code:


class AzureMessageQueue(MessageQueue):

    async def on_renew_error(renewable, error, _):
        print("On renew error -\n renewable: ", renewable,"\n error: ", error,"\n type: ", type(error), "\n message: ", error.message)
        if type(error) == MessageAlreadySettled:
            logger.warn("Message already settled")
        else:
            logger.warn("Error renewing lock: %s", error)

    def __init__(self, conn_str: str, queue_name: str) -> None:
        self.sb_client: ServiceBusClient = ServiceBusClient.from_connection_string(
            conn_str=conn_str,
            logging_enable=True,
            retry_total=10,
            retry_backoff_factor=1,
        )
        self.sender: ServiceBusSender = self.sb_client.get_queue_sender(queue_name)
        self.receiver: ServiceBusReceiver = self.sb_client.get_queue_receiver(
            queue_name
        )
        self.renewer: AutoLockRenewer = AutoLockRenewer(
            max_lock_renewal_duration=3600, on_lock_renew_failure=self.on_renew_error
        )

    async def send(self, message: str) -> None:
        sb_message = ServiceBusMessage(message)
        await self.sender.send_messages(sb_message)

    async def process(self, processor) -> AsyncIterator:
        async with self.receiver:
            async for msg in self.receiver:
                self.renewer.register(self.receiver, msg)
                message = str(msg)
                try:
                    result = await processor(message)
                    await self.receiver.complete_message(msg)
                    yield message, None, result
                except Exception as e:
                    yield message, e, None

Log:

On renew error -
 renewable:  <api.message_queue.AzureMessageQueue object at 0x7fe34bdaea90>
 error:  {"message": "test"}
 type:  <class 'azure.servicebus._common.message.ServiceBusReceivedMessage'>
 message:  {"message": "test"}

i'm trying to understand what caused the issue?

Im using python azure service bus sdk(azure-servicebus~=7.6.0).

Thanks in advance!

0 Answers0