Невозможно установить параметр на основе TimeSpan в фильтре подписки служебной шины Azure с помощью библиотеки Microsoft.Azure.ServiceBus. - PullRequest
0 голосов
/ 18 июня 2019

Используя более старую библиотеку «Windows.Azure.ServiceBus», я могу настроить SqlFilter, который принимает в качестве параметров TimeSpan, но когда я пытаюсь сделать то же самое с помощью библиотеки «Microsoft.Azure.ServiceBus», происходит сбой с следующая ошибка:

Объект не поддерживается типа: TimeSpan. Только следующие типы поддерживается через HTTP: строка, int, long, bool, double, DateTime

Что я пытаюсь сделать:

  1. Я хочу иметь 2 подписки на мою тему (highPriority, normalPriority)
  2. Сообщения имеют свойство пользователя с именем «StartDate»
  3. Если StartDate <= 1 день, то он должен перейти на подписку highPriority, иначе он должен перейти на normalPriority. [т.е. (StartDate - sys.EnqueuedDateTimeUtc) <= 24 часа]. </li>

Код, который работает (при использовании более старого пакета .net-framework 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);

Приведенный выше код выдает следующую ошибку:

Объект не поддерживается типа: TimeSpan. Только следующие типы поддерживается через HTTP: строка, int, long, bool, double, DateTime

Если вместо managementClient.UpdateRuleAsync я попробую использовать следующий код:

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

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

Сбой со следующей ошибкой (ServiceBusException):

Сообщение Службе не удалось обработать запрос; пожалуйста, повторите операция. Для получения дополнительной информации о типах исключений и надлежащем обработка исключений, пожалуйста, обратитесь к http://go.microsoft.com/fwlink/?LinkId=761101

Ссылка на майкрософт есть список исключений и FilterException, но это не так!

Вот трассировка стека 2-го исключения:

в Microsoft.Azure.ServiceBus.Amqp.AmqpSubscriptionClient.OnAddRuleAsync (RuleDescription описание) в C: \ источник \ лазурь-сервис шины DotNet \ SRC \ Microsoft.Azure.ServiceBus \ AMQP \ AmqpSubscriptionClient.cs: линия 132 в Microsoft.Azure.ServiceBus.SubscriptionClient.AddRuleAsync (RuleDescription описание) в C: \ источник \ лазурь-сервис шины DotNet \ SRC \ Microsoft.Azure.ServiceBus \ SubscriptionClient.cs: линия 499 в UserQuery.Main () в C: \ Users \ XXXX \ AppData \ Local \ Temp \ LINQPad6_quhgasgl \ niqvie \ LINQPadQuery.cs: линия 82

Итак, мои вопросы:

  1. Можно ли использовать параметры TimeSpan с использованием стандартной библиотеки .net? или мне придется использовать более старую библиотеку .net Framework, если я хочу использовать TimeSpans.

  2. Есть ли лучший способ реализовать то, что я пытаюсь сделать, способ работать с более новой стандартной библиотекой .net? (К вашему сведению: я думал об отправке вычисления в качестве параметра (десятичного), и тогда параметр будет двойным, а не TimeSpan). И на самом деле это то, что я мог бы в конечном итоге сделать.

1 Ответ

1 голос
/ 19 июня 2019

Если библиотека выдает исключение, заявляющее, что TimeSpan не является поддерживаемым типом, то это в значительной степени то, что у вас есть. Обратите внимание, что стандартный клиент .NET имеет две реализации: ManagementClient и некоторые операции через клиентов сущностей, таких как клиент подписки. Последнее реализовано с использованием AMQP. ManagementClient полностью основано на HTTP. Хотя было бы идеально использовать реализацию AMQP, она неполна. Я бы рекомендовал полагаться на ManagementClient. Это, вероятно, причина, по которой изменение правил с использованием клиента подписки вызывает исключение.

Что касается лучшего способа - ваша идея звучит правильно. Пока это не тот тип, который новый клиент не принимает. Кроме того, вы можете поднять проблему с командой библиотеки по номеру https://github.com/Azure/azure-sdk-for-net/issues, если хотите узнать причину, по которой TimeSpan больше не поддерживается.

...