【问题标题】:Service bus Topic subscription filter服务总线主题订阅过滤器
【发布时间】:2018-04-04 01:31:52
【问题描述】:
我正在开发一个将消息发布到服务总线主题的项目。我的主题有两个订阅。有没有办法过滤我的订阅者会收听的消息?
假设这是我的消息文本。
{
"Data" : {
"Name": "Johnny Cruz"
"Gender": "Male"
}
}
我只想收听包含男性的消息。这是在主题中可配置的吗?
【问题讨论】:
标签:
azureservicebus
servicebus
azure-servicebus-topics
【解决方案1】:
订阅者可以定义他们希望从某个主题接收哪些消息。你可以参考Topic filters and actions。
Service Bus 支持三种过滤条件:
-
布尔过滤器 - TrueFilter 和 FalseFilter 会导致为订阅选择所有到达的消息 (true) 或没有到达的消息 (false)。
-
SQL 过滤器 - SqlFilter 包含一个类似 SQL 的条件表达式,该表达式在代理中根据到达消息的用户定义属性和系统属性进行评估。所有系统属性都必须以 sys 为前缀。在条件表达式中。过滤条件的 SQL 语言子集测试是否存在属性 (EXISTS),以及空值 (IS NULL)、逻辑 NOT/AND/OR、关系运算符、简单数值算术和简单文本模式匹配喜欢。
-
相关过滤器 - CorrelationFilter 包含一组条件,这些条件与到达邮件的一个或多个用户和系统属性相匹配。一个常见的用途是匹配 CorrelationId 属性,但应用程序也可以选择匹配 ContentType、Label、MessageId、ReplyTo、ReplyToSessionId、SessionId、To 和任何用户定义的属性。当到达的消息的属性值等于相关过滤器中指定的值时,匹配存在。对于字符串表达式,比较区分大小写。指定多个匹配属性时,过滤器将它们组合为逻辑与条件,即过滤器要匹配,所有条件都必须匹配。
以下是演示代码:
使用过滤器创建订阅
var filter=new SqlFilter("(sys.Label='Male');
namespaceManager.CreateSubscription(topicName, subName,filter);
示例消息
var message = new BrokeredMessage(body);
var message.Label = "Male";// or Female