需要Azure耐用功能活动触发器吗



我有一个简单的耐用函数,我的目标是执行一些后台工作(在这种情况下,启动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;
}
}

不鼓励在编排器代码中启动异步操作,唯一的例外是由持久编排上下文启动的代码,例如CallActivityAsync()。这是由于协调器函数的检查点重播行为造成的。

文件的相关摘录

除非使用DurableOrchestrationContext API,否则Orchestrator代码不得启动任何异步操作。例如,没有Task.Run、Task.Delay或HttpClient.SendAsync.持久任务框架在单个线程上执行协调器代码,并且不能与任何其他可以由其他异步API调度的线程交互。

可以在协调器函数中安全等待的任务有时被称为持久任务。这些任务是由持久任务框架创建和管理的。例如CallActivityAsync、WaitForExternalEvent和CreateTimer返回的任务。

最新更新