是否需要Azure持久功能活动触发器?

时间:2018-07-26 16:48:07

标签: azure-functions

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

1 个答案:

答案 0 :(得分:1)

不建议在业务流程代码中启动异步操作,唯一的例外是持久业务流程上下文(例如CallActivityAsync())启动的代码。这是由于协调器功能的检查点重放行为引起的。

the documentation的相关摘录

  

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

     

在协调器功能中可以安全等待的任务有时被称为持久性任务。这些是由“持久任务框架”创建和管理的任务。示例是CallActivityAsync,WaitForExternalEvent和CreateTimer返回的任务。