没有 HttpTrigger 的 Azure 持久函数调用(自动启动)
Azure Durable Function Invoke without HttpTrigger (Autostart)
我正在查看此示例以 运行 一个持久函数 Activity 在设置的超时后。
这将允许我的函数 activity 执行数据处理,然后等待整整 1 小时,然后它会尝试再次加载。这将永远持续 运行。完美。
但是,将函数发布到 Azure 时,我不想通过关联的 HTTP 触发器手动 invoke/start 函数。我只想让持久化功能自动启动并开始处理。
这可能吗?如果没有,建议的解决方法是什么?
谢谢!
如评论中所述,一种方法是在您的发布管道中添加一个新任务。
这是我从你的问题中了解到的你的设置:
[FunctionName("ClientFunction")]
public static async Task<HttpResponseMessage> OnHttpTriggerAsync([HttpTrigger(AuthorizationLevel.Anonymous, "post")]
HttpRequestMessage request, [OrchestrationClient] DurableOrchestrationClient starter, ILogger logger)
{
// Triggers the orchestrator.
string instanceId = await starter.StartNewAsync("OrchestratorFunction", null);
return new HttpResponseMessage(HttpStatusCode.OK);
}
[FunctionName("OrchestratorFunction")]
public static async Task DoOrchestrationThingsAsync([OrchestrationTrigger] DurableOrchestrationContext context, ILogger logger)
{
DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromHours(1));
await context.CreateTimer(deadline, CancellationToken.None);
// Triggers some yout activity.
await context.CallActivityAsync("ActivityFunction", null);
}
[FunctionName("ActivityFunction")]
public static Task DoAnAwesomeActivity([ActivityTrigger] DurableActivityContext context)
{
}
现在,每次部署新版本的Function App,都需要编排器运行。不过,我觉得不能自己启动。
我的建议是有一个简单的 bash 脚本(使用 curl
或其他东西),它会在适当的 URL 调用 ClientFunction
。
最重要的是,此解决方案的优点之一是,如果 Azure 函数没有响应,您可以使部署失败。
这似乎也有效。
[FunctionName("AutoStart")]
public static async Task Run([TimerTrigger("*/5 * * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer,
[DurableClient] IDurableClient orchestrationClient, ILogger log)
{
string instanceId = await orchestrationClient.StartNewAsync("Start_Orchestrator", null);
}
我正在查看此示例以 运行 一个持久函数 Activity 在设置的超时后。
这将允许我的函数 activity 执行数据处理,然后等待整整 1 小时,然后它会尝试再次加载。这将永远持续 运行。完美。
但是,将函数发布到 Azure 时,我不想通过关联的 HTTP 触发器手动 invoke/start 函数。我只想让持久化功能自动启动并开始处理。
这可能吗?如果没有,建议的解决方法是什么?
谢谢!
如评论中所述,一种方法是在您的发布管道中添加一个新任务。
这是我从你的问题中了解到的你的设置:
[FunctionName("ClientFunction")]
public static async Task<HttpResponseMessage> OnHttpTriggerAsync([HttpTrigger(AuthorizationLevel.Anonymous, "post")]
HttpRequestMessage request, [OrchestrationClient] DurableOrchestrationClient starter, ILogger logger)
{
// Triggers the orchestrator.
string instanceId = await starter.StartNewAsync("OrchestratorFunction", null);
return new HttpResponseMessage(HttpStatusCode.OK);
}
[FunctionName("OrchestratorFunction")]
public static async Task DoOrchestrationThingsAsync([OrchestrationTrigger] DurableOrchestrationContext context, ILogger logger)
{
DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromHours(1));
await context.CreateTimer(deadline, CancellationToken.None);
// Triggers some yout activity.
await context.CallActivityAsync("ActivityFunction", null);
}
[FunctionName("ActivityFunction")]
public static Task DoAnAwesomeActivity([ActivityTrigger] DurableActivityContext context)
{
}
现在,每次部署新版本的Function App,都需要编排器运行。不过,我觉得不能自己启动。
我的建议是有一个简单的 bash 脚本(使用 curl
或其他东西),它会在适当的 URL 调用 ClientFunction
。
最重要的是,此解决方案的优点之一是,如果 Azure 函数没有响应,您可以使部署失败。
这似乎也有效。
[FunctionName("AutoStart")]
public static async Task Run([TimerTrigger("*/5 * * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer,
[DurableClient] IDurableClient orchestrationClient, ILogger log)
{
string instanceId = await orchestrationClient.StartNewAsync("Start_Orchestrator", null);
}