我有一个简单的耐用功能,我的目标是执行一些后台工作(在这种情况下,启动Azure数据库)。
我有下面的代码正在工作,但是我想知道需要ActivityTrigger函数的目的是什么。
如果我不包含它并尝试在CreateDB
本身中工作,则持久功能将永远无法正确完成并保持运行状态。
public static class CreateDBFn
{
private const string CreateDBConstant = "CreateDB";
private const string CreateDBTaskConstant = CreateDBConstant + "Task";
[FunctionName(CreateDBConstant + "Start")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = CreateDBConstant + "/{Name}")] HttpRequestMessage req,
[OrchestrationClient] DurableOrchestrationClientBase starter,
string Name,
ILogger log)
{
string instanceId = await starter.StartNewAsync(CreateDBConstant, Name);
log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
var res = starter.CreateCheckStatusResponse(req, instanceId);
res.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromSeconds(10));
return res;
}
[FunctionName(CreateDBConstant)]
public static async Task<bool> CreateDB([OrchestrationTrigger] DurableOrchestrationContextBase context)
{
var Name = context.GetInput<string>();
// I'd like to just do work here
await Task.Delay(30000);
// Why is it required to call out to an Activity?
var success = await context.CallActivityAsync<bool>(CreateDBTaskConstant, Name);
return true;
}
[FunctionName(CreateDBTaskConstant)]
public static async Task<bool> CreateDBTask([ActivityTrigger] string Name)
{
// preform work
await Task.Delay(30000);
return true;
}
}
答案 0 :(得分:1)
不建议在业务流程代码中启动异步操作,唯一的例外是持久业务流程上下文(例如CallActivityAsync()
)启动的代码。这是由于协调器功能的检查点重放行为引起的。
the documentation的相关摘录
除非使用DurableOrchestrationContext API,否则Orchestrator代码不得启动任何异步操作。例如,没有Task.Run,Task.Delay或HttpClient.SendAsync。耐用任务框架在单个线程上执行协调程序代码,并且无法与其他异步API可能调度的任何其他线程进行交互。
在协调器功能中可以安全等待的任务有时被称为持久性任务。这些是由“持久任务框架”创建和管理的任务。示例是CallActivityAsync,WaitForExternalEvent和CreateTimer返回的任务。