0

我有一个 Azure 函数 (f1) 将 Cosmos DB 文档作为输入,我想设置一个路径以将任何文档重定向到 Azure 服务总线队列,以防下游可能发生某种故障(SQL 语句到 SQL Server ) 可能。然后,我想在计时器上运行 Azure 函数 (f2),该计时器将充当这些重定向文档中的任何一个的“清理”,并尝试基本上执行 f1 尝试执行的相同操作。

我已经能够将单个文档或多个文档发送到 ServiceBus 队列,但是当它是单个文档时,我只能成功处理来自 f2 中队列的输入。请注意, f2 处于触发器状态,我仍然不确定如何从 Azure 函数中读取队列?我将如何在 1 个函数中完成对整个消息队列的迭代?绑定显示 ServiceBus 不是 Azure Functions 的有效“输入”,尽管它作为触发器有效。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:将参数绑定到复杂对象(例如 'ICollector1') uses Json.NET serialization. 1. Bind the parameter type as 'string' instead of 'ICollector1' 获取原始值并避免 JSON 反序列化,或者 2. 将队列有效负载更改为有效的 json。JSON 解析器失败:无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Microsoft.Azure.WebJobs.ICollector`1[Microsoft.Azure.Documents.Document]”,因为该类型需要 JSON 对象(例如 {"name":"value"})正确反序列化。要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组反序列化。路径'',第 1 行,位置 1。

我是处理 JSON、序列化和反序列化的完全新手。我只想解析它,从中读取内容并准备好向下游发送的 SQL 语句。

4

1 回答 1

0

目前,Service Bus Trigger 不支持批处理(多个项目作为输入)。请参阅服务总线批处理触发器github 问题。

如果我正确理解您的情况,您不一定必须接受批处理f2功能,也不需要“遍历整个消息队列”。

迭代将由函数处理。您的函数将被调用与发送到服务总线队列的f2消息一样多的次数。f1如果您在获取文档时一个接一个地“清理”它们,您最终将清理所有文档。

于 2018-05-16T07:20:56.500 回答