代码之家  ›  专栏  ›  技术社区  ›  aherrick

无HttpTrigger的Azure持久函数调用(Autostart)

  •  1
  • aherrick  · 技术社区  · 6 年前

    https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-eternal-orchestrations

    这将允许“我的函数”活动执行数据处理,然后在尝试再次加载前等待整整1小时。这将永远持续下去。完美的

    这可能吗?如果没有,建议的解决办法是什么?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Kzryzstof    6 年前

    正如评论中所讨论的,一种方法是在发布管道中添加一个新任务。

    [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应用程序时,都需要运行orchestrator。但是,我认为它不能自行启动。

    我建议使用一个简单的bash脚本(使用 curl 或者其他的)那会叫 ClientFunction 在适当的URL。

    Bash script

    除此之外,此解决方案的一个优点是,如果Azure功能没有响应,您可能会导致部署失败。

        2
  •  2
  •   Michal Grzegorzak    5 年前

    这似乎也在起作用。

    [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);
        }