当前位置: 首页 > 知识库问答 >
问题:

无法使用Microsoft.Azure.ServiceBus库在Azure服务总线订阅筛选器上设置基于TimeSpan的参数

益锦程
2023-03-14

使用较旧的“Windows.Azure.ServiceBus”库,我可以设置一个以TimeSpan为参数的SqlFilter,但当我使用“Microsoft.Azure.ServiceBus”库进行同样的尝试时,它失败了,出现以下错误:

对象的类型不受支持:TimeSpan。HTTP只支持以下类型:string、int、long、bool、double和DateTime

我要做的是:

  1. 我希望有2个关于我的主题的订阅(高优先级、正常优先级)
  2. 消息具有名为“StartDate”的用户属性
  3. 如果StartDate<=1天,则应转到高优先级订阅,否则应转到NormalPriority。[即(StartDate-sys.EnqueuedDateTimeUTC)<=24小时]。
SqlFilter highMessagesFilter =
       new SqlFilter("(StartDate-sys.EnqueuedTimeUtc) <= @TimeSpanImmediateWindow");
highMessagesFilter.Parameters.Add("@TimeSpanImmediateWindow", TimeSpan.FromDays(1));

var subscription = SubscriptionClient.CreateFromConnectionString(connectionString,topicName, subName1);
subscription.RemoveRule(RuleDescription.DefaultRuleName);
subscription.AddRule(new RuleDescription()
{
    Name = RuleDescription.DefaultRuleName,
    Filter = highMessagesFilter,
    Action = new SqlRuleAction("set priorityCalc = (StartDate-sys.EnqueuedTimeUtc)")
});
var filter = new SqlFilter("(StartDate-sys.EnqueuedTimeUtc) <= @TimeSpanHoursImmediateWindow");
filter.Parameters.Add("@TimeSpanHoursImmediateWindow",TimeSpan.FromDays(1));

var ruleDescription = new RuleDescription
{
    Filter = filter,
    Action = new SqlRuleAction(@"
        SET HighPriority = TRUE;
        SET Window = StartDate - sys.EnqueuedTimeUtc
        "),
    Name = RuleDescription.DefaultRuleName,

};

await managementClient.UpdateRuleAsync(topicPath,subscriptionName,ruleDescription);

上面的代码抛出以下错误:

对象的类型不受支持:TimeSpan。HTTP只支持以下类型:string、int、long、bool、double和DateTime

如果不使用ManagementClient.UpdateRuleAsync,则尝试使用以下代码:

var subClient = new SubscriptionClient(connectionString, topicPath, subscriptionName);

await subClient.RemoveRuleAsync(RuleDescription.DefaultRuleName);
await subClient.AddRuleAsync(ruleDescription);

它失败,出现以下错误(ServiceBusException):

有没有更好的方法来实现我正在尝试的工作,一种可以与较新的.NET标准库一起工作的方法?(请注意:我想把计算作为参数(decimal)发送,然后参数将是double,而不是TimeSpan)。事实上,这就是我最终可能要做的。

共有1个答案

漆雕原
2023-03-14

如果库抛出了一个异常,指出timespan不是受支持的类型,那么它几乎就是您所拥有的。注意,.NET标准客户端有两个实现,ManagementClient和一些通过实体客户端(如订阅客户端)进行的操作。后者是使用AMQP实现的。ManagementClient完全基于HTTP。虽然使用AMQP实现是理想的,但它是不完整的。我建议使用ManagementClient。这可能就是为什么使用订阅客户端修改规则会引发异常的原因。

关于更好的方法--你的主意听起来不错。只要它不是新客户端不接受的类型。此外,如果您想知道TimeSpan不再受支持的原因,可以在https://github.com/azure/azure-sdk-for-net/issues向库团队提出问题。

 类似资料:
  • 我试着按照1给出的教程学习。我创建了一个主题,其中有两个主题的订阅,分别使用sqlFilter(user_age<50)和(user_age>=50)。我为消息定义了一个自定义属性user_age。但当我发送关于这个主题的消息时,两个订阅都收到相同的消息,这是胡说八道!知道吗? 我的代码完全是从tuto中给出的代码中获得灵感的,只是我使用这段代码接收来自给定订阅的消息:

  • 我试图遵循Mark Heath的控制台应用程序示例,使用筛选后的订阅检索服务总线主题消息。但是,我实际上无法检索实际筛选的消息(Filtered1、Filtered2)。消息确实会被使用,但我无法查看它们,因为代码从未像处理非过滤消息(AllMessages)那样进入回调函数。对我错过了什么有什么想法吗? 发件人代码 接收机代码

  • 我之所以要这样做,是因为我们的服务在部署时配置订阅规则,并且具有消息代理的服务可能会在具有订阅客户端的服务更改规则集和新的业务逻辑之前部署该服务,该服务会发送一组新的消息。我们不希望丢失在部署期间发送的消息,并在新服务退出时处理它们。 干杯。

  • 来自第三次订阅的消息会发生什么情况,是否会在TTL之后发送到死信队列 有没有办法找出消息未被使用的订阅

  • 我有一个使用本教程的工作示例,可以根据需要发送和接收主题/订阅:https://azure.microsoft.com/en-us/documentation/articles/service-bus-queues-topics-subscriptions/ 但是,现在我想根据BrokeredMessage的to属性为每个订阅设置SQL过滤器。我后面的教程提到,有可能“创建订阅时,您可以提供一个对

  • 我已经能够弄清楚如何设置Azure ARM模板,该模板创建/管理Azure服务总线名称空间、主题和订阅,以接收所有消息。但是,ARM Tempates上的Microsoft文档仍然非常缺乏,我无法弄清楚如何在模板中为订阅定义一个SqlFilter,您可以使用.NET SDK管理该模板。 有人知道如何在ARM模板中向服务总线主题订阅添加Sql筛选器吗? 这里有一个ARM模板的链接,用于创建服务总线主