Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有动态sql筛选器查询的Azure服务总线主题订阅_Azure_Azure Functions_Azureservicebus_Azure Servicebus Topics - Fatal编程技术网

具有动态sql筛选器查询的Azure服务总线主题订阅

具有动态sql筛选器查询的Azure服务总线主题订阅,azure,azure-functions,azureservicebus,azure-servicebus-topics,Azure,Azure Functions,Azureservicebus,Azure Servicebus Topics,我正在尝试使用Azure服务总线在多个Azure功能之间传递消息。我正在代码中创建主题和订阅。但不确定如何从代码中添加筛选器查询。我想按id筛选邮件。e、 gSqlFilter($“'id'='{id}')。由于此筛选器,我不想为每条邮件创建一个订阅 是否可以对订阅使用不同的筛选器 可以通过为每个请求创建一个订阅,然后将其删除来修复此问题。但我不想创建这么多订阅。我的目标是每次调用函数时只更改过滤器 示例代码: var connectionString = ConfigurationManage

我正在尝试使用Azure服务总线在多个Azure功能之间传递消息。我正在代码中创建主题和订阅。但不确定如何从代码中添加筛选器查询。我想按id筛选邮件。e、 g
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;
            }
var connectionString=ConfigurationManager.AppSettings[“ServiceBus\u CONNECTION\u STRING”];
var名称空间管理器=
NamespaceManager.CreateFromConnectionString(connectionString);
如果(!wait namespaceManager.TopicExistsAsync(topicName))
{
//配置主题设置。
变量主题=新主题描述(主题名称)
{
MaxSizeInMegabytes=1024,
DefaultMessageTimeToLive=TimeSpan.FromMinutes(5)
};
等待namespaceManager.CreateTopicAsync(主题);
}
if(!wait namespaceManager.SubscriptionExistsAsync(topicName,subscription))
{
等待namespaceManager.CreateSubscriptionAsync(topicName,subscription);
}
var cts=new TaskCompletionSource();
var子客户=
SubscriptionClient.CreateFromConnectionString(connectionString,topicName,
认购);
var ruleDescription=new ruleDescription($“RequestIdRule{id}”,new SqlFilter($“'id'='{id}'));
wait subClient.AddRuleAsync(规则描述);
var options=newonMessageOptions();
subClient.OnMessage(m=>
{
尝试
{
var body=m.GetBody();
cts.SetResult(body);
}
捕获(例外情况除外)
{
m、 放弃();
}
},
选择权);
返回等待cts任务;
}
捕获(例外情况除外)
{
投掷;
}
是否可以对订阅使用不同的筛选器

对。单个主题及其所有订阅最多可以有2000个SQL筛选器(100000个用于相关筛选器)。见文件

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

我正在尝试使用Azure服务总线在多个Azure功能之间传递消息

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

最后

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

如果你有一个尖峰的消息,你的功能将被缩小。这意味着,您可以对不同的消息执行相同的函数。每条消息都需要在同一订阅下创建不同的规则。它不仅感觉不舒服,而且会在订阅上创建一个争用来更新规则,这将导致失败或错误行为