Как добавить фильтры в подписку на тему в Azure Service Bus - PullRequest
0 голосов
/ 26 июня 2018

Я хочу добавить фильтр для подписки, чтобы разные действия выполнялись для разных типов событий.

Как мне добавить к нему фильтры.Должен ли он быть добавлен перед отправкой в ​​тему или это можно сделать на портале Azure?

Ответы [ 4 ]

0 голосов
/ 16 мая 2019

Я предпочитаю использовать 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

0 голосов
/ 29 июня 2018

Следует ли добавить его перед отправкой в ​​тему или это можно сделать на портале Azure?

Вам нужен фильтр. Всякий раз, когда вы создаете тему с использованием .NET (пример полного фреймворка Брюса Чена или с новым клиентом, 3.1.0-preview и выше) или прямым REST API, тема будет содержать фильтр по умолчанию. Фильтр по умолчанию является фильтром перехвата всех. Вам нужно будет заменить его более конкретными фильтрами, если вы не хотите обрабатывать любое сообщение или оставить его как есть.

0 голосов
/ 03 июля 2018

Портал Azure предоставляет возможность создавать фильтры с помощью шаблона Azure Resource Manager. Это включает в себя написание пользовательского кода.

Перейдите на портале Azure в Пространство имен -> Тема -> Сценарий автоматизации

Нажмите Разверните и отредактируйте шаблон

"resources": [{

    "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, который имеет пользовательский интерфейс для создания правил подписки на темы.

0 голосов
/ 28 июня 2018

Как мне добавить фильтры к нему. Должен ли он быть добавлен перед отправкой в ​​тему или это можно сделать на портале Azure?

AFAIK, портал Azure не предоставляет возможность создания подписки в определенной теме служебной шины вместе с выражением фильтра.

По моему опыту, вам может потребоваться использовать клиентскую библиотеку Service Bus для вашего языка разработки, чтобы создать подписку с выражением фильтра. Для 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 применяется только к общему свойству класса BrokeredMessage или ключу словаря классов BrokeredMessage (например, BrokeredMessage.Properties).

...