使用动态sql过滤器查询的Azure Service Bus主题订阅

时间:2017-10-02 22:11:21

标签: azure azure-functions azureservicebus azure-servicebus-topics

我正在尝试使用Azure服务总线在多个azure函数之间传递消息。我在代码中创建主题和订阅。但不确定如何从代码中添加过滤器查询。我想通过id过滤消息。例如SqlFilter($"'id' ='{id}'")。由于此过滤器,我不想为每封邮件创建一个订阅。

是否可以为订阅设置不同的过滤器?

可以通过为每个请求创建一个订阅并在之后删除它来解决此问题。但我不想创建这么多订阅。我的目标是每次调用函数时更改过滤器。

示例代码:

var connectionString = ConfigurationManager.AppSettings["ServiceBus_CONNECTION_STRING"];
                var namespaceManager =
                    NamespaceManager.CreateFromConnectionString(connectionString);
                if (!await namespaceManager.TopicExistsAsync(topicName))
                {
                    // Configure Topic Settings.
                    var topic = new TopicDescription(topicName)
                    {
                        MaxSizeInMegabytes = 1024,
                        DefaultMessageTimeToLive = TimeSpan.FromMinutes(5)
                    };

                    await namespaceManager.CreateTopicAsync(topic);
                }

                if (!await namespaceManager.SubscriptionExistsAsync(topicName, subscription))
                {
                    await namespaceManager.CreateSubscriptionAsync(topicName, subscription);
                }

                var cts = new TaskCompletionSource<T>();
                var subClient =
                    SubscriptionClient.CreateFromConnectionString(connectionString, topicName,
                        subscription);

                var ruleDescription = new RuleDescription($"RequestIdRule{id}", new SqlFilter($"'id' ='{id}'"));

                await subClient.AddRuleAsync(ruleDescription);
                var options = new OnMessageOptions();

                subClient.OnMessage(m =>
                    {
                        try
                        {

                            var body = m.GetBody<T>();
                            cts.SetResult(body);
                        }
                        catch (Exception ex)
                        {

                            m.Abandon();
                        }
                    },
                    options);

                return await cts.Task;

            }
            catch (Exception ex)
            {
                throw;
            }

1 个答案:

答案 0 :(得分:2)

  

是否可以为订阅设置不同的过滤器?

是。包含所有订阅的单个主题最多可包含2,000个SQL过滤器(100,000个用于相关过滤器)。请参阅文档here

您无法更新过滤器。您需要删除旧规则并通过创建一个新规则替换它。但是如果你经常在运行时这样做,我会质疑这种方法的效率。

  

我正在尝试使用Azure服务总线在多个azure函数之间传递消息。

或者,您可以让每个函数都有其输入队列,其中链接这些函数将向适当的Azure Service Bus输入队列发送消息。

最后,

  

我的目标是每次调用函数时更改过滤器。

如果您有大量的消息,您的功能将被扩展。这意味着,您可以为不同的消息执行相同的功能。每条消息都需要在同一订阅下创建不同的规则。它不仅感觉不合适,而且会在订阅时产生争用,以更新规则,从而导致失败或行为不正确。