Azure Service Bus请求成功但队列无消息问题排查
异步方法未正确触发执行
你的send_single_message是异步方法,若调用时未使用await关键字(或在同步上下文未用asyncio.run()包裹),方法会被挂起但实际未执行发送逻辑。比如同步HTTP触发函数中直接调用send_single_message(),函数会直接结束,消息根本没发出去,但不会抛出异常,导致请求和日志都显示"成功"。ServiceBusClient被提前回收
__init__中创建的servicebus_client是局部变量,__init__执行完毕后可能被Python垃圾回收机制回收,导致后续sender操作失效。需将servicebus_client保存为类属性,确保其在实例生命周期内存在:
class ServiceBusSenderClient: def __init__(self, fully_qualified_namespace, queue_name): credentials = DefaultAzureCredential() self.servicebus_client = ServiceBusClient(fully_qualified_namespace=fully_qualified_namespace, credential=credentials, logging_enable=True) self.sender = self.servicebus_client.get_queue_sender(queue_name=queue_name) async def send_single_message(self, message:str): message = ServiceBusMessage(message) await self.sender.send_messages(message) logging.info(f"Sent message: {message} to queue {self.sender.queue_name}") def close(self): self.sender.close() self.servicebus_client.close()
消息进入死信队列或被锁定
检查Service Bus队列的死信队列,确认是否因消息大小超限、属性不合法等原因被移入死信。同时查看队列指标中的「锁定消息数」,若有其他消费者正在处理消息,消息会处于锁定状态,暂时不在活跃消息列表中。日志未真实反映执行状态
当前日志仅打印固定文本,可修改为包含消息内容、队列名称的详细日志,确认代码是否真的执行到发送完成步骤。另外,ServiceBusClient开启logging_enable=True后会生成详细发送日志,去Azure Function的日志面板搜索Service Bus相关条目,查看是否有消息ID、发送回执等关键信息,确认发送操作是否实际执行。Azure Function异步上下文不匹配
若函数是同步触发类型(如同步HTTP触发),调用异步方法必须用asyncio.run()包裹,否则异步任务无法完成执行:
import asyncio import azure.functions as func def main(req: func.HttpRequest) -> func.HttpResponse: sender = ServiceBusSenderClient("<你的命名空间>", "<队列名>") asyncio.run(sender.send_single_message("测试消息")) sender.close() return func.HttpResponse("消息发送请求已处理")
内容的提问来源于stack exchange,提问作者Nakeuh

