如何动态安排定期执行?

问题描述 投票:0回答:1

我需要定期在网站上进行一些计算。困难的一点是,它们不是按完全固定的时间间隔运行,因为最终用户将它们安排为每N分钟运行一次(可以随时更改),然后在工作日结束前暂停并恢复第二天早上再来一次,否则在周末之后。最终用户甚至可以指定根本无法运行的日期。基本上,我不能使用固定的时间表。

另外,我有几个这样的计算与自己的时间表同时运行。

到目前为止,我一直作为网络作业来运行它,旋转多个Task(每个计算时间表一个,并无限期地等待所有这些:await Task.WhenAll(calculationTasks);

每个任务由一个while (true) {循环组成,其中I:

  1. 运行实际计算
  2. 计算下一次计算的时间
  3. 将线程Thread.Sleep()暂停适当的毫秒数:就像我上面所说的,这可能要花几分钟到几天。

它在大多数情况下都可以正常工作,但是我有实例突然无法工作,并且webjob需要重新启动。我对此实现方式缺乏信心,因为它在某种程度上还不够坚固。

你们有没有遇到过类似的问题?这种动态任务调度的最佳/方法实施方案是什么?

c# azure-webjobs
1个回答
0
投票

您可以使用函数来执行Pawel的Hangfire建议。这与您已经在做的事情相似。 Web作业在后台充当主机,并在每个功能的timer trigger中设置的计时器上运行各个功能。您只需要执行计划表或设置Webjob即可完成繁琐的工作。

您将为每个作业运行一个功能,并使用C# script (.csx files)使功能保持动态。工作来自管理功能脚本。

这是我如何转换您的项目。随意借用,编辑或以您自己的方式进行:

  1. 为了使更新更容易,我将采用您的计算逻辑,并将其放入bin文件夹内的类库中,或将它们转换为.csx文件,并将其添加到[[ C0]文件夹。然后,您可以在函数中使用它,而无需通过使用函数.csx文件顶部的./shared复制它。这是可选的

所以现在我们有:-wwwroot| -网站(如果您使用相同的应用程序服务)| -分享| | -Calculation1Logic.csx| | -Calculation2Logic.csx

|箱子| | CalculationLogic.dll


  1. 制作一些包含这些计算中的每一个的功能模板。

calculation1Function.csx示例

wwwroot

  1. [要创建新作业,我将使用#load "..\shared\calculation1Logic.csx"端点#load "..\shared\calculation1Logic.csx" using Microsoft.Extensions.Logging; public static void Run(TimerInfo myTimer, ILogger log) { log.LogInformation($"running calculation 1: {DateTime.Now}"); calculation1Logic(myTimer, log); } 并将模板和计时器绑定以及转换为CRON语法的时间表传递给它。由于通过示例创建起来很容易,因此createfunction MSDN线程中就有一个。它在Node中,但是当我使用.csx而不是预编译的代码时,可以使用相同的动态添加函数的方法。确保使函数名称唯一并存储它们,以便以后可以编辑或删除它们。

现在这些是我拥有的文件,基于这些文件如何从API请求中转换而来:-wwwroot| -网站(如果您使用相同的应用程序服务)| -分享| | -Calculation1Logic.csx| | -Calculation2Logic.csx| -User1_Calculation1| | -run.csx| | -function.json| | -function.proj| -User2_Calculation2| | -run.csx| | -function.json| | -function.proj| -host.json(函数运行时的一部分以及extensions.csproj)| -extensions.csproj| -bin


  1. 编辑时间表。这是有点棘手的地方。有两种方法可以做到这一点。最安全的方法是每次删除并重新添加该功能。另一种是用更新的绑定替换in the Azure Management API。这种方式有点超出您的“应做”范围,但是它允许动态重新绑定。如果只有一个绑定,this是一个简单的文件,所以您应该可以通过编程生成它。

function.json示例

function.json

您可以通过FTP访问文件而无需完全部署即可替换App Service中的文件。现在,由于通过FTP function.json更改了要执行新计划的主机进程,因此您将需要向{ "bindings": [ { "name": "myTimer", "type": "timerTrigger", "direction": "in", "schedule": "0 */5 * * * *" } ] } doesn't notify发送请求以进行更新。这不会重新启动完整的应用程序,但是如果您经常更改时间表,则可能希望在计时器上运行该API调用-每分钟或任何间隔最适合您。

© www.soinside.com 2019 - 2024. All rights reserved.