3

我有一个由 Timer Trigger 每天触发一次的持久功能:

[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 Trigger 触发持久功能,所以我添加了这个:

[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 触发器或 timer 触发器都会触发该函数,但在类中同时包含这两者意味着两个触发器事件都不会发生。是否可以让多个触发器类型启动一个编排触发器?

4

2 回答 2

3

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

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

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

于 2019-02-14T12:23:15.887 回答
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);
}
于 2019-10-02T07:19:58.867 回答