我正在尝试构造一个Azure ServiceBus订阅规则,该规则将根据参数的subjectFilter
数组属性的长度来使用相关过滤器或SQL过滤器。我尝试使用基于this answer的if
和union
来实现这一点。但是,看起来该对象是用所有属性构造的。例如,sql筛选器错误为“必须为相关性筛选器设置至少一个系统或用户属性”
这是我的代码(简化版)。
- copy变量包含用于每个订阅名称和
filterProperties
的属性,其中定义了filterType
,并用作基本properties
对象。 - 它还分别为
sqlFilterProperties
和correlationFilterProperties
声明了一个单独的对象。 sqlFilterProperties
或correlationFilterProperties
对象应与filterProperties
联合以构造完整的properties
。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"resourceName": {
"type": "string"
},
"topics": {
"type": "array"
},
"subscriptionName": {
"type": "string"
}
},
"variables": {
"apiVersion": "2018-01-01-preview",
"copy": [
{
"name": "subscriptions",
"count": "[length(parameters('topics'))]",
"input": {
"name": "[concat(parameters('resourceName'), '/', parameters('topics')[copyIndex('subscriptions')].name, '/', parameters('subscriptionName'))]",
"filterProperties": {
"filterType": "[if(greater(length(parameters('topics')[copyIndex('subscriptions')].subjectFilter),1),'sqlFilter','correlationFilter')]"
},
"sqlFilterProperties": {
"sqlFilter": {
"sqlExpression": "[concat('sys.subject in (''',join(parameters('topics')[copyIndex('subscriptions')].subjectFilter,''','''), ''')')]",
"requiresPreprocessing": false
}
},
"correlationFilterProperties": {
"correlationFilter": {
"subject": "[parameters('topics')[copyIndex('subscriptions')].subjectFilter[0]]",
"requiresPreprocessing": false
}
}
}
}
]
},
"resources": [
{
"type": "Microsoft.ServiceBus/namespaces/topics/subscriptions/rules",
"apiVersion": "[variables('apiVersion')]",
"copy": {
"name": "subscriptionFilters",
"count": "[length(parameters('topics'))]"
},
"name": "[concat(variables('subscriptions')[copyIndex()].name, '/subject')]",
"properties": "[union(variables('subscriptions')[copyIndex()].filterProperties, if(startsWith(variables('subscriptions')[copyIndex()].filterProperties.filterType, 'sql'), variables('subscriptions')[copyIndex()].sqlFilterProperties, variables('subscriptions')[copyIndex()].correlationFilterProperties) )]"
}
]
}
字符串
2条答案
按热度按时间jtjikinw1#
您可以根据
filter
类型有条件地分配筛选器属性,而不是直接使用union
方法。使用equals
函数将滤波器类型与'correlationFilter'
或'sqlFilter'
进行比较。字符串
或者,在使用
CorrelationRuleFilter
默认构造函数时,还可以使用系统属性(如(ContentType、Label、MessageId、ReplyTo)和用户定义的值进行筛选。使用IDictionary string, object
>属性Properties为相关性过滤器提供用户定义的属性,如详细的here。omqzjyyz2#
我通过一张支持票从微软得到了这个答案。问题是
subject
元数据属性在创建过滤器时实际上被称为label
。(在C#中,它被称为Subject
。)因此,只需将sqlExpression更改为使用sys.Label
,并将correlationFilter属性更改为使用Label
就可以解决这个问题。参见文档
https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads
https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.servicebus.message.label?view=azure-dotnet的