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



使用较旧的"Windows.Azure.ServiceBus"库,我能够设置一个将TimeSpan作为其参数的SqlFilter,但是当我使用"Microsoft.Azure.ServiceBus"库尝试相同的操作时,它失败并出现以下错误:

对象不是受支持的类型:时间跨度。只有以下类型是 通过HTTP支持:字符串,整数,长整型,布尔值,双精度,日期时间

我想做什么:

  1. 我想在我的主题上订阅 2 个订阅(高优先级、正常优先级)
  2. 消息具有名为"开始日期"的用户属性
  3. 如果 StartDate <= 1 天,则它应该转到高优先级订阅,否则它应该转到正常优先级。[即(开始日期 - 系统。EnqueuedDateTimeUtc) <= 24 小时]。

有效的代码(使用较旧的.net框架Windows.Azure.ServiceBus包时):

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)")
});

其中,此代码(使用:Microsoft.Azure.ServiceBus)不起作用:

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);

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

对象不是受支持的类型:时间跨度。只有以下类型是 通过HTTP支持:字符串,整数,长整型,布尔值,双精度,日期时间

如果不是 managementClient.UpdateRuleAsync,我尝试使用以下代码:

var subClient = new SubscriptionClient(connectionString, topicPath, subscriptionName);
await subClient.RemoveRuleAsync(RuleDescription.DefaultRuleName);
await subClient.AddRuleAsync(ruleDescription);

它失败,并显示以下错误 (服务总线异常):

消息 服务无法处理请求;请重试 操作。有关异常类型和正确 异常处理,请参考 http://go.microsoft.com/fwlink/?LinkId=761101

微软链接是指向异常列表和FilterException,但它不是!

下面是第二个异常的堆栈跟踪:

在 Microsoft.Azure.ServiceBus.Amqp.AmqpSubscriptionClient.OnAddRuleAsync(RuleDescription 描述)在 C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\Amqp\AmqpSubscriptionClient.cs:line 132 在 Microsoft.Azure.ServiceBus.SubscriptionClient.AddRuleAsync(RuleDescription 描述)在 C:\source\azure-service-bus-dotnet\src\Microsoft.Azure.ServiceBus\SubscriptionClient.cs:line 499 at UserQuery.Main() in C:\Users\XXXX\AppData\Local\Temp\LINQPad6_quhgasgliqvie\LINQPadQuery.cs:line 82

所以我的问题是:

我可以使用 .net 标准库使用
  1. TimeSpan 参数吗?或者如果我想使用 TimeSpans,我必须使用较旧的 .net 框架库。

  2. 有没有更好的方法来实现我正在尝试做的事情,一种可以与较新的 .net 标准库一起使用的方法?(仅供参考:我考虑过将计算作为参数(十进制)发送,然后参数将是双精度,而不是 TimeSpan)。事实上,这就是我最终可能会做的事情。

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

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

最新更新