如何从Azure Function中返回多条Service Bus消息?
Azure Function Service Bus输出绑定批量发送消息解答
你完全可以在Azure Function中批量输出多个Message(旧版Service Bus SDK)/ServiceBusMessage(5.x+新版SDK)实例,你对ICollector<T>泛型参数的推测是错误的:
当
T指定为原生Service Bus消息类型时,输出绑定会直接识别原生消息实例的所有配置,不会将其作为负载序列化处理,SessionId、MessageId、自定义属性等所有消息配置都可以正常生效。
可用实现方式
- 同步场景使用
ICollector<Message>/ICollector<ServiceBusMessage>的Add()方法逐条添加消息 - 异步场景使用
IAsyncCollector<Message>/IAsyncCollector<ServiceBusMessage>的AddAsync()方法逐条添加消息 - 隔离进程模型中也可以直接返回
ServiceBusMessage[]数组批量输出消息
示例代码(进程内模型 5.x+新版SDK)
using Azure.Messaging.ServiceBus; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; using System; using System.Text; public static class SendMultipleServiceBusMessages { [FunctionName("SendBatchMessages")] public static void Run( [TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo, [ServiceBus("target-queue-name", Connection = "YourServiceBusConnString")] ICollector<ServiceBusMessage> outputMessages, ILogger log) { // 批量生成10条消息,每条可独立配置所有消息属性 for (int i = 0; i < 10; i++) { var message = new ServiceBusMessage(Encoding.UTF8.GetBytes($"业务数据内容 {i}")) { SessionId = $"session-group-{i % 4}", // 正常配置会话ID MessageId = Guid.NewGuid().ToString(), TimeToLive = TimeSpan.FromHours(2), Subject = $"业务消息类型{i}" }; // 添加自定义业务属性 message.ApplicationProperties.Add("BizType", $"Order_{i}"); message.ApplicationProperties.Add("Priority", i % 2 == 0 ? "High" : "Normal"); outputMessages.Add(message); } log.LogInformation("批量消息添加完成"); } }
注意事项
- 仅当
T为自定义POCO类时,绑定才会自动将POCO序列化为JSON作为消息负载,此时无法为单条消息单独配置SessionId等属性 - 批量发送的总消息大小不能超过Service Bus对应层级的单批发送限制:标准层单批最大256KB,高级层单批最大1MB,超出限制需要拆分多个批次发送
- 异步场景优先使用
IAsyncCollector获得更好的运行性能
内容的提问来源于stack exchange,提问作者Herman Kan
相关产品推荐
相关产品推荐

