无法将数据推送至Azure Event Hub问题求助
问题分析与解决方案
核心错误原因
你使用了异步版本的EventHubProducerClient(azure.eventhub.aio下的客户端),但Blob触发的函数是同步函数,同步线程中未初始化asyncio事件循环,因此抛出RuntimeError: There is no current event loop。
解决方案1:改用同步版EventHubProducerClient
直接替换为同步客户端,无需处理事件循环,适配同步函数场景:
import azure.functions as func import logging # 补充原代码缺失的logging导入 from azure.eventhub import EventData, EventHubProducerClient # 导入同步版客户端 def main(myblob: func.InputStream): logging.info(f"Python blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes") event_hub_connection_string = "Endpoint=sb://event-hub-namespace/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=sharedaccesskey" event_hub_name = "event_hub_name" # 初始化同步版ProducerClient producer = EventHubProducerClient.from_connection_string( event_hub_connection_string, eventhub_name=event_hub_name ) event_data = EventData(b'Hello, Event Hub!') # send_batch要求传入EventData列表,而非单个对象 with producer: producer.send_batch([event_data])
解决方案2:将函数改为异步模式
若想保留异步客户端,需将Blob触发函数改为异步模式,Azure Functions支持异步函数:
import azure.functions as func import logging from azure.eventhub import EventData from azure.eventhub.aio import EventHubProducerClient async def main(myblob: func.InputStream): # 函数定义前添加async关键字 logging.info(f"Python blob trigger function processed blob \n" f"Name: {myblob.name}\n" f"Blob Size: {myblob.length} bytes") event_hub_connection_string = "Endpoint=sb://event-hub-namespace/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=sharedaccesskey" event_hub_name = "event_hub_name" producer = EventHubProducerClient.from_connection_string( event_hub_connection_string, eventhub_name=event_hub_name ) event_data = EventData(b'Hello, Event Hub!') # 异步上下文管理器使用async with,异步方法前加await async with producer: await producer.send_batch([event_data])
连接字符串正确性验证
检查你的连接字符串是否符合以下要求:
Endpoint格式:需为sb://<实际命名空间名>.servicebus.windows.net/,替换代码中的event-hub-namespace为真实命名空间名称SharedAccessKeyName:若使用命名空间级密钥,RootManageSharedAccessKey是默认名称;若使用Event Hub级密钥,需对应正确的密钥名称SharedAccessKey:替换为实际的密钥值,确保无多余空格或特殊字符- 若代码中已指定
eventhub_name,连接字符串无需包含EntityPath=<Event Hub名称>;若未指定,则需在连接字符串中添加该字段
内容的提问来源于stack exchange,提问作者Ravi kant Gautam
相关产品推荐
相关产品推荐

