如何在Azure Service Bus中向主题的订阅添加筛选器

时间:2018-06-26 09:35:00

标签: azure azureservicebus azure-servicebus-topics

我想为订阅添加过滤器,以便对不同类型的事件执行不同的操作。

如何为它添加过滤器。 在发送至主题之前是否应添加 还是可以在azure门户网站中完成?

5 个答案:

答案 0 :(得分:1)

可以在 Azure 门户中为特定订阅添加过滤器,也可以在从编码端发送时添加。

在这里我分享的是我们可以从 Azure Portal

添加过滤器的方法

示例:在下面的代码中,我向名为“apptopic”的主题发送消息

for(int i=0;i<5;i++)
{
  Order obj = new Order();
  var _message = new Message(Encoding.UTF8.GetBytes(obj.ToString()));
  _message.MessageId = $"{i}";
  _message.UserProperties.Add("Category", Exams[i]);           
  await _client.SendAsync(_message);
  Console.WriteLine($"Sending Message : {obj.Id} ");
}

此主题已被三个订阅订阅A订阅B订阅C订阅。

所以我想在 MessageId 为 1 时向 SubscriptionC 添加一个过滤器来接收消息。

因此转到您想要添加过滤器的特定订阅。然后删除屏幕截图中突出显示的默认过滤器。 enter image description here

然后单击添加过滤器,提供屏幕截图中提到的过滤器名称和过滤器条件,然后保存更改。 enter image description here

在此流程订阅中,

  1. 订阅 A 将收到 - 5 条消息
  2. 订阅 B 将收到 - 5 条消息
  3. 订阅 C 将收到 - 1 条消息(由于添加了过滤器)

答案 1 :(得分:0)

  

如何为它添加过滤器。应该在发送到主题之前添加它还是可以在azure门户中完成它?

AFAIK,Azure门户不提供用于在特定服务总线主题下创建订阅以及过滤器表达式的功能。

根据我的经验,您可能需要使用服务总线客户端库作为开发语言,才能使用过滤器表达式创建订阅。对于C#,您可以按照下面的代码片段创建订阅并检索消息:

var namespaceManager = SB.NamespaceManager.CreateFromConnectionString("{connectionString}");

//create a subscription with the filter expression
if (!namespaceManager.SubscriptionExists("{your-topic-name}", "{your-subscription-name}"))
{
    namespaceManager.CreateSubscription("{your-topic-name}", "{your-subscription-name}", new SqlFilter("sys.Label='important' or MessageId<0"));
}

//send topic message(s)
var msg= new BrokeredMessage("Hello World");
msg.Properties["From"] = "Bruce Chen";
msg.Label = "important";
msg.Properties["MessageId"] = 1;
var client = TopicClient.CreateFromConnectionString("{connectionString}", "{your-topic-name}");
client.Send(msg);

//subscription receives message(s)
var subClient =SubscriptionClient.CreateFromConnectionString(connectionString, "{your-topic-name}", "{your-subscription-name}");
subClient .OnMessage(m =>
{
    Console.WriteLine(m.GetBody<string>() + "," + m.Label + "," + m.Properties["From"] + "," + m.Properties["MessageId"]);
});
Console.ReadLine();

此外,SQLFilter syntax仅适用于BrokeredMessage类的公共属性或BrokeredMessage类字典的键(例如BrokeredMessage.Properties)。

答案 2 :(得分:0)

  

是在发送到主题之前添加它还是可以在azure门户中完成?

您需要一个过滤器。每当您使用.NET(Bruce Chen的完整框架示例或使用新客户端,3.1.0-preview及更高版本)或streight REST API创建主题时,主题都将包含默认过滤器。默认过滤器是全部捕获过滤器。如果您不想处理任何消息或将其保留,则需要用更特定的过滤器替换它。

答案 3 :(得分:0)

Azure门户提供了通过Azure资源管理器模板创建筛选器的功能。它涉及编写自定义代码。

在Azure门户中导航到命名空间-> 主题-> 自动化脚本

点击部署并编辑模板

“资源”:[{

    "apiVersion": "[variables('sbVersion')]",

    "name": "[parameters('serviceBusNamespaceName')]",

    "type": "Microsoft.ServiceBus/Namespaces",

    "location": "[variables('location')]",

    "sku": {

        "name": "Standard",

    },

    "resources": [{

        "apiVersion": "[variables('sbVersion')]",

        "name": "[parameters('serviceBusTopicName')]",

        "type": "Topics",

        "dependsOn": [

            "[concat('Microsoft.ServiceBus/namespaces/', parameters('serviceBusNamespaceName'))]"

        ],

        "properties": {

            "path": "[parameters('serviceBusTopicName')]"

        },

        "resources": [{

            "apiVersion": "[variables('sbVersion')]",

            "name": "[parameters('serviceBusSubscriptionName')]",

            "type": "Subscriptions",

            "dependsOn": [

                "[parameters('serviceBusTopicName')]"

            ],

            "properties": {},

            "resources": [{

                "apiVersion": "[variables('sbVersion')]",

                "name": "[parameters('serviceBusRuleName')]",

                "type": "Rules",

                "dependsOn": [

                    "[parameters('serviceBusSubscriptionName')]"

                ],

                "properties": {

                    "filterType": "SqlFilter",

                    "sqlFilter": {

                        "sqlExpression": "StoreName = 'Store1'",

                        "requiresPreprocessing": "false"

                    },

                    "action": {

                        "sqlExpression": "set FilterTag = 'true'"

                    }

                }

            }]

        }]

    }]

}]

现在部署资源。

以此为基础,可以创建带有规则的主题订阅。

或者,您可以使用ServiceBus Explorer或Serverless360之类的工具,这些工具具有用于创建主题订阅规则的用户界面。

答案 4 :(得分:0)

我更喜欢使用CLI编写脚本;我觉得这非常容易。因此,在创建订阅后,我将添加规则,即过滤器。请注意,您无法更新$ Default规则。创建您自己的规则的操作将删除默认设置。然后,您可以更新规则。

az servicebus topic subscription rule create --resource-group myresourcegroup --namespace-name mynamespace --topic-name mytopic --subscription-name mysubscription --name myrule --filter-sql-expression myproperty=myvalue

参考:https://docs.microsoft.com/en-us/cli/azure/servicebus/topic/subscription/rule?view=azure-cli-latest#az-servicebus-topic-subscription-rule-create