我有一个耐用的功能,每天由计时器触发器触发一次:
[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触发器或计时器触发器)将触发该函数,但是在类中都包含这两个函数意味着不会发生任何触发事件。可以有多种触发器类型来启动业务流程触发器吗?
答案 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);
}