Service Bus Topic订阅消息过滤配置咨询:仅接收Male性别消息
当然可以实现!
Azure Service Bus的订阅本身就支持通过过滤规则筛选特定消息,刚好匹配你只接收Gender为Male的消息需求。下面给你两种常用的实现方案:
方案一:基于消息体JSON结构过滤
如果你的消息内容就是像示例那样嵌套在JSON里,只要确保发布消息时正确设置内容类型,就能直接通过SQL表达式过滤嵌套字段:
发布消息时配置ContentType
发布消息时,把ContentType设为application/json,这样Service Bus能解析消息体的JSON结构:var jsonPayload = "{ \"Data\" : { \"Name\": \"Johnny Cruz\", \"Gender\": \"Male\" } }"; var message = new Message(Encoding.UTF8.GetBytes(jsonPayload)) { ContentType = "application/json" }; await topicClient.SendAsync(message);给订阅添加SQL过滤规则
- 在Azure门户进入你的Topic对应的订阅页面
- 找到「过滤规则」选项,点击「添加」
- 选择「SQL过滤」,在过滤表达式中输入:
Data.Gender = 'Male' - 保存规则后,这个订阅就只会接收符合条件的消息了
也可以用代码添加规则:
var subscriptionClient = new SubscriptionClient(connectionString, topicName, subscriptionName); var maleFilter = new SqlFilter("Data.Gender = 'Male'"); await subscriptionClient.AddRuleAsync("FilterMaleMessages", maleFilter); // 记得删除默认的TrueFilter,不然会接收所有消息 await subscriptionClient.RemoveRuleAsync(RuleDescription.DefaultRuleName);
方案二:基于自定义消息属性过滤(推荐)
如果希望过滤性能更高,建议把Gender作为消息的自定义属性传递,这样Service Bus不需要解析整个消息体就能完成过滤:
发布消息时添加自定义属性
var jsonPayload = "{ \"Data\" : { \"Name\": \"Johnny Cruz\", \"Gender\": \"Male\" } }"; var message = new Message(Encoding.UTF8.GetBytes(jsonPayload)) { ContentType = "application/json", UserProperties = { { "Gender", "Male" } } }; await topicClient.SendAsync(message);配置订阅过滤规则
过滤表达式更简单:Gender = 'Male',不管是门户配置还是代码添加,只需要把表达式换成这个即可。
注意事项
- 一定要删除订阅默认的
TrueFilter规则,不然默认会接收所有消息,你的过滤规则就起不到作用了 - SQL过滤表达式支持常见的比较操作(=, !=, >, <等),也可以结合逻辑运算符(AND/OR)实现更复杂的过滤
内容的提问来源于stack exchange,提问作者Ramppy Dumppy
相关产品推荐
相关产品推荐

