You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:45:15