如何在Azure Function中为队列/主题消息添加自定义属性
在Azure Function中为Service Bus消息添加自定义筛选属性
我懂你想要实现的效果——通过Azure Function往Service Bus的主题或队列发消息时,给消息加上自定义属性,这样就能用这些属性来设置订阅的筛选规则,把消息分流到不同的订阅里。你之前的代码能正常运行,但确实找不到添加自定义属性的入口对吧?
先贴一下你最初的可运行代码:
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, ICollector<Contact> outputSbMsg) { var contactList = await req.Content.ReadAsAsync<ContactList>(); foreach(var contact in contactList.Contacts) { if (contact.ContactId == -1) { continue; } contact.State = contactList.State; outputSbMsg.Add(contact); } }
这段代码直接把Contact对象丢给输出集合,Azure会自动帮你序列化对象生成Service Bus消息,但这种方式下你没法手动添加自定义属性,所以得换个方式来创建消息。
解决方案:手动创建BrokeredMessage来添加属性
后来按照建议调整了代码,核心是改用BrokeredMessage来封装消息内容,这样就能自由添加自定义属性了。具体步骤是先把Contact对象序列化成JSON字符串,再包装成BrokeredMessage,然后给消息添加自定义属性,最后加入输出集合。修改后的代码如下:
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, ICollector<BrokeredMessage> outputSbMsg) { var contactList = await req.Content.ReadAsAsync<ContactList>(); foreach(var contact in contactList.Contacts) { if (contact.ContactId == -1) { continue; } string jsonData = JsonConvert.SerializeObject(contact); BrokeredMessage message = new BrokeredMessage(jsonData); // 这里添加自定义属性,示例用了contactList.State,你也可以换成请求头里的其他数据 message.Properties.Add("State", contactList.State); outputSbMsg.Add(message); } }
关键要点:
- 把输出集合的类型从
ICollector<Contact>改成ICollector<BrokeredMessage>:这样我们就能直接操作Service Bus的消息对象,而不是让Azure自动处理 - 用
JsonConvert.SerializeObject序列化Contact对象:把对象转成JSON字符串作为消息的内容,确保消息能正确被消费端解析 - 通过
message.Properties.Add()添加自定义属性:这些属性会被Service Bus识别,你可以在主题的订阅里设置筛选规则,比如根据State的值来过滤消息
现在你就可以把从请求头或者联系人列表里拿到的其他数据,也通过message.Properties.Add()添加成自定义属性,实现更灵活的订阅筛选逻辑啦。
内容的提问来源于stack exchange,提问作者TGnat
相关产品推荐
相关产品推荐

