簡體   English   中英

持久函數可以有多個觸發器嗎?

[英]Can durable functions have multiple triggers?

我有一個由定時器觸發器每天觸發一次的持久函數:

[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 觸發器或計時器觸發器將觸發該函數,但在類中同時包含這兩個觸發器意味着不會發生觸發事件。 是否可以讓多個觸發器類型啟動一個編排觸發器?

我相信每個函數只能有一個觸發器類型,但可以建議您將所有邏輯寫入單獨的項目/程序集,然后只引用程序集並通過參數調用入口點,保持函數實現干凈簡單,並集中另一個項目(或同一項目中的類)中的執行邏輯。

在您的代碼中,您應該有 Orchestrator 和 Activity 函數,因此您可以編寫一個 Activity 函數來完成這項工作,並從兩個協調器中調用它。 Durable Functions 的指導是保持編排器干凈和簡單的管理 - 編排,將工作卸載到活動。

我建議您查看基於計時器的需求的持久監視器模式,並查看 HTTP 觸發器的HTTP API

您可以做的是創建多個普通函數,每種類型的觸發器一個。 計划觸發器、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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM