持久功能可以有多个触发器吗?

时间:2019-02-14 12:18:04

标签: 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
}

这很好。出于测试目的,我还希望能够通过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");
}

在本地运行这些命令(包括http触发器或计时器触发器)将触发该函数,但是在类中都包含这两个函数意味着不会发生任何触发事件。可以有多种触发器类型来启动业务流程触发器吗?

2 个答案:

答案 0 :(得分:1)

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

在您的代码上,您应该具有Orchestrator和Activity函数,因此您可以编写一个Activity函数来完成工作,并从两个Orchestrators进行调用。关于持久功能的指导是保持编排人员的清洁和简单管理,即编排,将工作转移到活动中。

我建议您查看durable monitor pattern,了解基于计时器的要求,并查看HTTP APIs,了解HTTP触发器。

答案 1 :(得分:0)

您可以做的是创建多个普通功能,每种触发类型一个。计划的触发器,http触发器,blob触发器或任何其他受支持的触发器。

在该功能内,您可以启动新的业务流程功能。该业务流程功能本身不需要触发器。您只需要DurableOrchestrationContext。

public static async Task<object> RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context,
    ILogger log)
{
    // orchestration logic here
}

[FunctionName("Info_HttpStart1")]
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "starter1")]HttpRequestMessage req,
    [OrchestrationClient]DurableOrchestrationClient starter,
    ILogger log)
{
    // Function input comes from the request content.
    string instanceId = await starter.StartNewAsync("Info", null);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    return starter.CreateCheckStatusResponse(req, instanceId);
}

[FunctionName("Info_HttpStart2")]
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "starter2")]HttpRequestMessage req,
    [OrchestrationClient]DurableOrchestrationClient starter,
    ILogger log)
{
    // Function input comes from the request content.
    string instanceId = await starter.StartNewAsync("Info", null);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    return starter.CreateCheckStatusResponse(req, instanceId);
}