Azure Service Bus会话队列锁续期失败:SessionLockLostError求助
会话锁过期问题排查与修复
核心问题
你的代码中AutoLockRenewer的上下文管理器作用范围错误:仅在注册会话后就退出了上下文,导致续期逻辑在消息处理阶段已经停止运行,无法持续维护会话锁,最终引发锁过期错误。
修复方案
将消息接收、处理的完整逻辑移入AutoLockRenewer的async with块内部,确保续期机制在整个会话生命周期内持续生效。
修正后的代码
async def __call__(self): receiver = self.servicebus_client.get_queue_receiver( queue_name=self.request_queue, session_id=NEXT_AVAILABLE_SESSION, receive_mode=ServiceBusReceiveMode.PEEK_LOCK, ) async with receiver: try: # 将AutoLockRenewer的上下文覆盖整个消息处理流程 async with AutoLockRenewer( max_lock_renewal_duration=300, on_lock_renew_failure=self.my_callback, ) as auto_lock_renewer: auto_lock_renewer.register(receiver, receiver.session) # 消息接收与处理逻辑移入续期上下文内 async for msg in receiver: logger.info( f"Session locked until: {receiver.session.locked_until_utc}" ) logger.info(f"Received msg {msg}") msg_body = await self.run(msg) sender = self.servicebus_client.get_queue_sender( queue_name=self.reply_queue, session_id=msg.session_id ) async with sender: message_to_send = ServiceBusMessage( msg_body, session_id=msg.session_id ) await sender.send_messages(message_to_send) logger.info("Message successfully sent!") # 完成消息处理 await receiver.complete_message(msg) except Exception as e: logger.info("CLOSING RECEIVER") await receiver.close() tb = traceback.format_exc() logger.error(f"Failed to process message with exception {e} \n {tb}")
额外注意事项
- 确认队列的会话锁初始时长:如果默认60秒不足以支撑初始处理延迟,可在创建队列时适当调高(比如设置为120秒),配合AutoLockRenewer的续期逻辑双重保障。
- 避免在会话未释放前重复创建接收器:确保同一会话仅被一个接收器持有,防止锁冲突。
- 检查
on_lock_renew_failure回调的日志:如果续期失败,回调会触发,可通过日志排查网络或服务端异常。
内容的提问来源于stack exchange,提问作者James Steele
相关产品推荐
相关产品推荐

