0

我正在 Azure 上试验两种基于.NET Framework的可以定时器触发的机制:Azure Function v1WebJob。AF 部署在 Function App 上,WebJob 部署在 Api App 上。两者都有免费计划集。

我希望通过 CRON 计划重复运行一些测试代码(控制台中的 1 行)(测试两者:“0 */10 * * * *”,每 10 分钟一次)将是一项简单的任务。看起来并非如此。

注意:在开始实验之前,我通过测试队列触发的 WebJob 已经知道应该将连续 WebJob 设置为“始终开启”以防止在一个小时左右后休眠。但这不能在免费和共享计划上启用。但是,在队列触发的 WebJob 上,我设法通过向应用程序发送经过身份验证的请求以在每次向队列中添加新消息时唤醒它来创建一种解决方法,这样我可以确保 WebJob 在它有时不处于休眠状态需要完成的一些工作,即要处理的队列消息。

但是我认为计时器触发的 WebJob 不应该是“连续的”,而应该是“触发的”。但是当我将它部署为“触发”时,我得到了这个错误:

(内部异常 #0)ExitCode:-1,输出:命令 'cmd /c ""HeartbeatW ...' 由于 121 秒内没有输出或 CPU 活动而中止。如果需要,您可以增加 SCM_COMMAND_IDLE_TIMEOUT 应用程序设置(或 WEBJOBS_IDLE_TIMEOUT,如果这是一个 WebJob)。

我不确定增加超时如何帮助解决这个问题以及应该设置哪个值,但我的主代码可能有问题:

static void Main()
{
    var builder = new HostBuilder();
    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddTimers();
    });
    builder.ConfigureLogging((context, b) =>
    {
        b.AddConsole();

    });
    var host = builder.Build();
    using (host)
    {
        host.Run();
    }
}

将 WebJob 部署为“连续”而不是“触发”可防止此错误,但仍有 2 个问题:

  • 部署后,我需要转到门户并选择“运行”以启动 WebJob - 我还没有发现这是否可以自动化,或者我是否必须切换到付费计划
  • WebJob 在运行一个小时左右后进入睡眠状态(因为它在免费计划上运行并且不能设置为“始终开启”),这次我没有解决方法来唤醒它,因为没有手动操作涉及

进一步使用 Azure Function,情况会变得更糟。如果我部署我的函数,请稍等片刻,然后转到函数>监视器,我可以看到函数没有在它应该运行的时间段上运行。但是,如果我保持监视器视图打开,那么我可以看到函数现在已开始按计划运行!所以我猜想查看日志会触发函数唤醒,就像向应用程序发送经过身份验证的请求到 WebJob 一样。至少它会持续一个小时左右,因为在那之后功能日志不会显示新的运行。

我读过 Azure Function 和 WebJob 都在引擎盖下的同一个调度程序上运行。这是 Azure Function 出现这种行为的原因吗?

所有这些都是设计的,不能改变吗?还是我应该在部署过程中做一些调整?

4

1 回答 1

2

您的情况在 Portal 中不正常。由于我不确定您的项目,让我们再一步一步地完成工作。


.NET Framework 4.7.2上的WebJob sdk 。

  1. 在 Visual Studio 中创建基于 .net framework 4.7.2 的控制台应用。 在此处输入图像描述

  2. 将代码粘贴到 Program.cs。为 Azure WebJob Sdk 添加 Azure 存储连接。

     static async Task Main()
     {
         var builder = new HostBuilder();
         builder.ConfigureWebJobs(b =>
         {
             b.AddAzureStorageCoreServices();
             b.AddAzureStorage();
             b.AddTimers();
         });
         builder.ConfigureLogging((context, b) =>
         {
             b.AddConsole();
         });
         var host = builder.Build();
         using (host)
         {
             await host.RunAsync();
         }
     }
    
  3. 本地测试,发现没有工作功能。 在此处输入图像描述

  4. 在项目中添加函数:右键单击您的项目->添加->新项目-> Class.cs ->将其重命名为Function。这是每分钟运行一次的函数。

     public static void ProcessTimerTrigger([TimerTrigger("0 * * * * *")] TimerInfo myTimer, ILogger logger)
             {
                 logger.LogInformation("Message from Class1.");
             }
    
  5. 安装所需的软件包。以下是我使用的一些 webjob 包和版本:

     <package id="Microsoft.Azure.WebJobs" version="3.0.23" targetFramework="net472" />
     <package id="Microsoft.Azure.WebJobs.Extensions" version="4.0.1" targetFramework="net472" />
     <package id="Microsoft.Azure.WebJobs.Extensions.Storage" version="4.0.3" targetFramework="net472" />
     <package id="Microsoft.Azure.WebJobs.Host.Storage" version="4.0.1" targetFramework="net472" />
     <package id="Microsoft.Extensions.Hosting" version="5.0.0" targetFramework="net472" />
     <package id="Microsoft.Extensions.Logging" version="5.0.0" targetFramework="net472" />
     <package id="Microsoft.Extensions.Logging.Console" version="5.0.0" targetFramework="net472" />
    
  6. 为 Azure 存储连接配置 appsettings.json。

     {
       "ConnectionStrings": {
         "AzureWebJobsStorage": "YourStorageConnectionString;"
       }
     }
    
  7. 在本地运行。成功地。 在此处输入图像描述


  1. 作为 WebJob 部署到门户。成功地。 在此处输入图像描述

  1. 对于 Function,即使您不打开日志,它也会运行。您可以在很多地方查看,例如指标、kudu 日志文件(https://yourapp.scm.azurewebsites.net/DebugConsole-> LogFiles -> Application -> Functions -> Function -> YourFunctionName -> file)。

顺便说一句,将控制台应用程序发布为 WebJob 时,请选择连续运行。

参考:开始使用 Azure WebJobs SDK 进行计时器触发后台处理

于 2020-12-18T08:08:02.193 回答