持久功能 - 使用状态无限执行不起作用

时间:2017-07-12 16:58:30

标签: azure azure-functions

我正在建立一个持久的函数,它应该通过每小时调用一次并保持状态来无限运行。函数编译,总线在运行时失败,出现以下错误:

  

2017-07-12T07:04:05.614执行函数时出现异常:Functions.DurableTimer。   Microsoft.Azure.WebJobs.Host:异常绑定参数'context'。   Microsoft.Azure.WebJobs.Extensions.DurableTask:无法转换为DurableOrchestrationContext。

功能代码

#r "Microsoft.Azure.WebJobs.Extensions.DurableTask"

using System;
using System.Threading;

public static async Task Run(DurableOrchestrationContext context, TraceWriter log)
{
    log.Info($"Durable function executed at: {context.CurrentUtcDateTime}");

    // sleep for one hour between calls
    DateTime nextExecution = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextExecution, CancellationToken.None);

    int counterState = context.GetInput<int>();
    log.Info($"Counter state: {counterState}");

    counterState++;

    context.ContinueAsNew(counterState); 
}

function.json

{
  "bindings": [
    {
      "name": "context",
      "type": "orchestrationTrigger",
      "direction": "in"
    }
  ],
  "disabled": false
}

1 个答案:

答案 0 :(得分:3)

我的猜测是你试图在门户网站UI中手动触发编排功能,但目前不支持这种功能。我通过尝试重现您的确切方案并点击门户网站中的运行按钮进行了验证。我已经打开了一个错误来跟踪此问题:https://github.com/Azure/azure-functions-durable-extension/issues/10

假设是这种情况,您可以通过创建一个知道如何触发您的协调器功能的单独函数来解决它。以下是我在GitHub问题中发布的示例:

<强>代码

#r "Microsoft.Azure.WebJobs.Extensions.DurableTask"

using System;

public static async Task Run(string functionName, DurableOrchestrationClient starter, TraceWriter log)
{
    log.Info($"Starting orchestration named: {functionName}");
    string instanceId = await starter.StartNewAsync(functionName, null);
    log.Info($"Started orchestration with ID = '{instanceId}'.");   
}

<强> function.json

{
  "bindings": [
    {
      "type": "manualTrigger",
      "direction": "in",
      "name": "functionName"
    },
    {
      "name": "starter",
      "type": "orchestrationClient",
      "direction": "in"
    }
  ],
  "disabled": false
}

这是一个通用函数,可以按名称启动任何orchestrator函数。在您的情况下,您可以将DurableTimer作为输入。

道歉,这是不明显的,感谢您在我们顺利体验时的耐心。 :)