Получение JSON (документов Cosmos DB) в качестве входных данных от служебной шины Azure в функциях Azure - PullRequest
0 голосов
/ 15 мая 2018

У меня есть функция Azure (f1), которая принимает документы Cosmos DB в качестве входных данных, и я хочу указать путь для перенаправления любых документов в очередь шины обслуживания Azure в случае сбоя, который может произойти в нисходящем направлении (оператор SQL дляSQL Server) возможно.Затем я хочу запустить функцию Azure (f2) на таймере, который будет служить «очисткой» для любого из этих перенаправленных документов, и попытаться сделать то же самое, что и f1.

Я былсмог отправить один документ или несколько документов в очередь ServiceBus, но я смог успешно обработать ввод из очереди в f2 только тогда, когда это был один документ.Обратите внимание, что f2 находится на триггере, и я все еще не уверен, как даже прочитать очередь из функции Azure?Как мне выполнить итерацию всей очереди сообщений в одной функции?Привязки показывают, что ServiceBus не является допустимым «Вводом» для функций Azure, хотя он действителен как триггер.https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings

С чем я работаю ниже:

f1 с одним выходом

#r "Microsoft.Azure.Documents.Client"
#r "Microsoft.ServiceBus"
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.Documents;
using System.Collections.Generic;
using System;

public static void Run(IReadOnlyList<Document> inputFeed, TraceWriter log,
    out Document outputSbQueue)
{
  //f1 with a single output to a Queue
}

f1 с выходом ICollector

#r "Microsoft.Azure.Documents.Client"
#r "Microsoft.ServiceBus"
using Microsoft.ServiceBus.Messaging;
using Microsoft.Azure.Documents;
using System.Collections.Generic;
using System;

public static void Run(IReadOnlyList<Document> inputFeed, TraceWriter log,
    ICollector<Document> outputSbQueue)
{
  //f1 with an ICollector output
}    

f2 с одним входом от триггера ServiceBus (работает)

#r "Microsoft.Azure.Documents.Client"
#r "Newtonsoft.Json"
using Microsoft.Azure.Documents;
using System.Collections.Generic;
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
public static void Run(Document myQueueItem, TraceWriter log)
{
    //f2 with a working single input -- myQueueItem is an SB trigger
}

f2 с ICollector или любым видом ввода IEnumerable (не работает ... выдает исключение о сериализации JSon во время выполнения)

#r "Microsoft.Azure.Documents.Client"
#r "Newtonsoft.Json"
using Microsoft.Azure.Documents;
using System.Collections.Generic;
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;

public static void Run(IReadOnlyList<Document> myQueueItem, TraceWriter log)
{
    //f2 with an input of more than one document
}

выдает это исключение:

2018-05-15T20: 48: 21.535 [Ошибка] Исключение при выполнении функции: Functions.ServiceBusQueueTriggerCSharp1.Microsoft.Azure.WebJobs.Host: параметр привязки исключения 'myQueueItem'.Microsoft.Azure.WebJobs.ServiceBus: привязка параметров к сложным объектам (например, 'ICollector 1') uses Json.NET serialization. 1. Bind the parameter type as 'string' instead of 'ICollector 1', чтобы получить необработанные значения и избежать десериализации JSON, или 2. Измените полезную нагрузку очереди на допустимый json. Сбой синтаксического анализа JSON:Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «Microsoft.Azure.WebJobs.ICollector`1 [Microsoft.Azure.Documents.Document]», поскольку для типа требуется объект JSON (например, имя {)":" value "}) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {" name ":" value "}), либо измените десериализованный тип на массив или тип, реализующий коллекциюинтерфейс (например, ICollection, IList), такой как List, который можно десериализовать из массива JSON. JsonArrayAttribute также можно добавить к типу, чтобы заставить его десериализовать из массива JSON. Path '', строка 1, позиция 1.

Я - полный новичок в работе с JSON, сериализацией и десериализацией. Я просто хочу разобрать его, прочитать что-то из него и получить SQL-оператор.ады отправить вниз по течению.

1 Ответ

0 голосов
/ 16 мая 2018

В настоящее время триггер служебной шины не поддерживает пакеты (несколько элементов в качестве входных данных). См. Пакетный запуск служебной шины Проблема github.

Если я правильно понимаю ваш сценарий, вам не обязательно принимать пакет в функции f2, и при этом вам не нужно «перебирать всю очередь сообщений».

Итерация будет обрабатываться функциями. Ваша f2 функция будет вызываться столько раз, сколько сообщений f1 отправляется в очередь служебной шины. Если вы «очищаете» документы один за другим по мере их получения, вы в конечном итоге очистите все документы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...