从Microsoft.Azure.ServiceBus迁移到Azure.Messaging.ServiceBus发送主题消息咨询
你的实现方向是正确的,Azure.Messaging.ServiceBus 包的发送逻辑确实遵循「创建ServiceBusClient实例→为指定主题创建ServiceBusSender→构造ServiceBusMessage发送」的流程。不过你当前的代码遗漏了旧版本中设置的几个核心消息属性,需要补充后才能和原有业务逻辑完全对齐。
新旧版本的属性对应关系如下:
- 旧版
Message.CorrelationId→ 新版ServiceBusMessage.CorrelationId,用法完全一致 - 旧版
Message.Label→ 新版ServiceBusMessage.Subject,属于属性改名,是迁移高频踩坑点 - 旧版
Message.UserProperties→ 新版ServiceBusMessage.ApplicationProperties,存储自定义键值对的用法不变
额外优化提示:ServiceBusClient本身是线程安全的,建议不要在每次调用方法时都新建实例,可将其作为单例注入或者类的全局字段复用,避免频繁创建销毁带来的不必要连接开销。
补全后的完整实现如下:
// 建议将ServiceBusClient实例提为全局复用,此处示例仅展示方法内逻辑对齐 public async Task SendMessageToServiceBusTopic<T>(T request, string topicSubName, string submissionNumber) { // 实际使用时建议复用client实例,不要每次新建 ServiceBusClient client = new ServiceBusClient(settings.ServiceBusConnectionString); ServiceBusSender sender = client.CreateSender(settings.ServiceBusTopic); byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(request)); var message = new ServiceBusMessage(bytes) { CorrelationId = context.CorrelationId, Subject = topicSubName, ApplicationProperties = { { "TrackingId", submissionNumber } } }; await sender.SendMessageAsync(message); // 仅当你不再需要使用sender和client时再释放,复用实例的情况下不需要每次调用都释放 // await sender.DisposeAsync(); // await client.DisposeAsync(); }
内容的提问来源于stack exchange,提问作者azureLover
相关产品推荐
相关产品推荐

