azure-durable-functions - 避免在 Orchestrator 功能中多次执行
问题描述
我在 Orchestrator 函数中有以下代码:
[FunctionName("OrchestratorFunction")]
public async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
_log.LogMessageAsync(new LogMessage { Message = "OrchestratorFunction started" });
var groups= await context.CallActivityAsync<AzureADGroup[]>("GroupsReaderFunction", null);
try
{
if (groups.Length == 0)
{
_ = _log.LogMessageAsync(new LogMessage { Message = "No source groups" });
_ = _calculator.SendEmailAsync();
}
else
{
var processingTasks = new List<Task<List<AzureADUser>>>();
foreach (var group in groups)
{
var processTask = context.CallSubOrchestratorAsync<List<AzureADUser>>("SubOrchestratorFunction", group});
processingTasks.Add(processTask);
}
await Task.WhenAll(processingTasks);
var users = new List<AzureADUser>();
foreach (var task in processingTasks)
users.AddRange(await task);
distinctUsers = users.GroupBy(user => user.ObjectId).Select(userGrp => userGrp.First()).ToList();
_ = _log.LogMessageAsync(new LogMessage { Message = "Found users" });
}
}
catch (Exception ex)
{
_ = _log.LogMessageAsync(new LogMessage { Message = "Caught unexpected exception" });
distinctUsers = null;
}
finally
{
if (distinctUsers != null)
{
await context.CallActivityAsync("UsersSenderFunction", distinctUsers);
}
else
{
await context.CallActivityAsync("JobStatusUpdaterFunction", null);
}
}
_ = _log.LogMessageAsync(new LogMessage
{
Message = distinctUsers != null ? "Successfully sent users from source groups":
"Error while reading users from source groups"
});
if (!context.IsReplaying) _ = _log.LogMessageAsync(new LogMessage { Message = "OrchestratorFunction completed" });
}
}
}
这段代码的哪些部分应该移动到活动函数中以避免多次执行?
解决方案
推荐阅读
- acumatica - 我可以将自定义键字段添加到基本 Acumatica 表吗?
- java - 不是抽象的,并且不会覆盖回调中的抽象方法 onError(Exception)
- reactjs - NextJS:将 json 加载到 _app.js vs pages 中的 getInitialProps 并避免重复调用
- r - 降低 R 中 arules 的支持阈值
- ios - React Native 在设备 iOS 崩溃上运行
- r - 调整标题
- javascript - 当从 ref 触发时,Safari 会忽略文件输入的 onChange
- javascript - 为什么 Web 元素仅随机抛出带有 TimedOut 原因的 CypressError?
- node.js - 列出带有附件的邮件的附件超时,否则快速返回
- python - 自定义标签(模板标签)未加载