持久函数可以有多个触发器吗?

Aid*_*dan 5 c# azure-functions azure-durable-functions

我有一个持久函数,每天由计时器触发器触发一次:

[FunctionName("MyDurableFunction")]
public static async Task Run(
    [TimerTrigger("0 0 23 * * *", RunOnStartup = false)] TimerInfo myTimer,
    [OrchestrationClient] DurableOrchestrationClient starter,
    ILogger log)
{
    await starter.StartNewAsync("OrchestrationFunction", null);
}

[FunctionName("OrchestrationFunction")]
public static async Task OrchestrationFunction(
    [OrchestrationTrigger]DurableOrchestrationContext context,
    ILogger log)
{
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

这很好用。出于测试目的,我还希望能够通过 Http 触发器触发持久功能,因此我添加了以下内容:

[FunctionName("MyDurableFunctionHttpTrigger")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "demo")]HttpRequest req, 
    [OrchestrationClient] DurableOrchestrationClient starter, 
    ILogger log)
{
    await starter.StartNewAsync("OrchestrationFunction", null);
    return new OkObjectResult("blah");
}
Run Code Online (Sandbox Code Playgroud)

在本地运行这些触发器(包括 http 触发器或计时器触发器)将触发该函数,但将两者都包含在类中意味着这两个触发事件都不会发生。是否可以让多个触发器类型启动编排触发器?

Mur*_*oft 3

我相信每个函数只能有一种触发器类型,但可以建议您将所有逻辑写入单独的项目/程序集中,然后仅引用程序集并通过参数调用入口点,从而保持函数实现干净、简单并集中另一个项目(或同一项目中的类)中的执行逻辑。

在您的代码中,您应该具有 Orchestrator 和 Activity 函数,因此您可以编写一个 Activity 函数来完成工作并从两个 Orchestrator 调用它。持久功能的指导是保持编排器的干净和简单管理——编排,将工作卸载到活动。

我建议您查看持久监视器模式来满足基于计时器的需求,并查看HTTP 触发器的HTTP API