我可以将单个 运行 的 Azure 函数中的多个项目排队吗?
Can I queue multiple items from a single run of an Azure Function?
我有一个 Node.js timerTrigger
Azure 函数,它处理一个集合并将处理结果排队以供进一步处理(通过 Node.js queueTrigger
函数)。
代码如下:
module.exports = function (context, myTimer) {
collection.forEach(function (item) {
var items = [];
// do some work and fill 'items'
var toBeQueued = { items: items };
context.bindings.myQueue = toBeQueued;
});
context.done();
};
此代码只会对最后一个 toBeQueued
进行排队,而不是我尝试对每个进行排队。
有什么方法可以让多个项目排队吗?
更新
明确地说,我说的是在 forEach
的每次迭代中对 toBeQueued
进行排队,而不仅仅是对数组进行排队。是的,Azure Functions 存在问题,因此我无法对数组进行排队,但我有解决方法;即 { items: items }
.
还没有,但我们会在一周内解决这个问题,敬请关注:) 您将能够像上面尝试的那样将数组传递给绑定。
我们在 public 存储库 here 中跟踪这个问题。感谢报告。
Mathewc 的答案是关于节点的正确答案。
对于 C#,您现在可以通过指定 ICollector<T>
作为输出队列参数的类型。
下面是我有两个输出队列的示例,其中一个是我通过 for 循环添加的。
public static void Run(Item inbound, DateTimeOffset InsertionTime, ICollector<Item> outbound, ICollector<LogItem> telemetry, TraceWriter log)
{
log.Verbose($"C# Queue trigger function processed: {inbound}");
telemetry.Add(new LogItem(inbound, InsertionTime));
if(inbound.current_generation < inbound.max_generation)
{
for(int i = 0; i < inbound.multiplier; i++) {
outbound.Add(Item.nextGen(inbound));
}
}
}
我有一个 Node.js timerTrigger
Azure 函数,它处理一个集合并将处理结果排队以供进一步处理(通过 Node.js queueTrigger
函数)。
代码如下:
module.exports = function (context, myTimer) {
collection.forEach(function (item) {
var items = [];
// do some work and fill 'items'
var toBeQueued = { items: items };
context.bindings.myQueue = toBeQueued;
});
context.done();
};
此代码只会对最后一个 toBeQueued
进行排队,而不是我尝试对每个进行排队。
有什么方法可以让多个项目排队吗?
更新
明确地说,我说的是在 forEach
的每次迭代中对 toBeQueued
进行排队,而不仅仅是对数组进行排队。是的,Azure Functions 存在问题,因此我无法对数组进行排队,但我有解决方法;即 { items: items }
.
还没有,但我们会在一周内解决这个问题,敬请关注:) 您将能够像上面尝试的那样将数组传递给绑定。
我们在 public 存储库 here 中跟踪这个问题。感谢报告。
Mathewc 的答案是关于节点的正确答案。
对于 C#,您现在可以通过指定 ICollector<T>
作为输出队列参数的类型。
下面是我有两个输出队列的示例,其中一个是我通过 for 循环添加的。
public static void Run(Item inbound, DateTimeOffset InsertionTime, ICollector<Item> outbound, ICollector<LogItem> telemetry, TraceWriter log)
{
log.Verbose($"C# Queue trigger function processed: {inbound}");
telemetry.Add(new LogItem(inbound, InsertionTime));
if(inbound.current_generation < inbound.max_generation)
{
for(int i = 0; i < inbound.multiplier; i++) {
outbound.Add(Item.nextGen(inbound));
}
}
}