Azure持久功能活动似乎已运行多次,但尚未完成

Azure持久功能活动似乎已运行多次,但尚未完成,azure,orchestration,azure-durable-functions,Azure,Orchestration,Azure Durable Functions,我有一个持久的功能扇出和进入模式,似乎无法可靠地工作。编排每10分钟从计时器函数调用一次,但此后已将其增加到20。 使用context.CallActivityAsync调用Activity函数并返回整数(已处理的行数)。目前,传入的工作项应仅包含2个要处理的项。第一项处理所有行,并在日志中显示完整的行。第二项有时显示正在处理的行,但在某个点上它只是停止。。。没有其他活动被识别,并且“完成”从未显示在日志中。另外,第二个活动有时显示它同时运行多次。。。 我已经在我的开发机器上使用相同的数据尝试了

我有一个持久的功能扇出和进入模式,似乎无法可靠地工作。编排每10分钟从计时器函数调用一次,但此后已将其增加到20。 使用context.CallActivityAsync调用Activity函数并返回整数(已处理的行数)。目前,传入的工作项应仅包含2个要处理的项。第一项处理所有行,并在日志中显示完整的行。第二项有时显示正在处理的行,但在某个点上它只是停止。。。没有其他活动被识别,并且“完成”从未显示在日志中。另外,第二个活动有时显示它同时运行多次。。。 我已经在我的开发机器上使用相同的数据尝试了这段代码,并且它的处理过程不超过5分钟。我还将hosts.json文件设置为

{
  "version": "2.0",
  "functionTimeout": "00:10:00",
  "extensions": {
    "queues": {
      "maxPollingInterval": "00:00:05"
    }
  }
}
编排:

public static async void RunOrchestrator(
            [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
        {
            log.LogInformation($"************** Fanning out ********************");
            var parallelTasks = new List<Task<int>>();
            //object[] workBatch = await context.CallActivityAsync<object[]>("GETVendors", null);
            object[] workBatch = GETVendors(log); //work batch only has 2 items 
            for (int i = 0; i<workBatch.Length; i++)
            {
                Task<int> task = context.CallActivityAsync<int>("SynchVendor", workBatch[i]);
                parallelTasks.Add(task);
            }

            log.LogInformation($"************** 'Waiting' for parallel results ********************");
            await Task.WhenAll(parallelTasks);
            log.LogInformation($"************** All activity functions complete ********************");

            log.LogInformation($"************** fanning in ********************");
            int cnt = 0;
            foreach (var completedParallelActivity in parallelTasks)
            {
                cnt += completedParallelActivity.Result;
            }
            log.LogInformation($"Total Records Converted across all tasks = {cnt}");
            //return outputs;
        }
公共静态异步void RunOrchestrator(
[OrchestrationTrigger]DurableOrchestrationContext上下文,ILogger日志)
{
log.LogInformation($“**********************展开**********************”);
var parallelstasks=新列表();
//object[]workBatch=wait context.CallActivityAsync(“GETVendors”,null);
object[]workBatch=GETVendors(log);//工作批处理只有2项

对于(int i=0;i对于额外的日志记录,您需要在日志前面添加此项。日志***操作:

if (!context.IsReplaying) 
有关更多信息,请参阅

对于无法完成的问题,您可以做以下几件事:

  • 您没有错误处理。如果活动函数引发异常,会发生什么情况?您应该尝试/捕获日志,以便在出现故障时通知您
  • 函数日志显示了什么?请注意,我所说的不是customDimensions.Category==“User”(即您的日志条目)的日志,而是函数运行时执行的日志。在appinsights日志中,在适当的时间范围内运行“union traces | union exceptions”,以查看函数运行时正在执行的操作
  • 尝试添加超时任务,以便即使您的某个任务未完成,您的编排器也能完成。请参阅

  • 谢谢kwill,我确实有Try/Catch错误处理,在Catch上创建了一个带有e.message的日志。到目前为止,我还没有收到任何有错误的日志。对日志的检查显示没有异常,但在处理重复条目时加载了跟踪:SynchVendor 800已处理,毫秒后SynchVendor 800已处理…然后是另一组SynchVendor 1000已处理,SynchVendor 1000已处理…它应该达到5000左右,但永远不会超过1400然后停止。(它也不应该与相同的供应商ID并行运行)。
    if (!context.IsReplaying)