Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure函数和WebJob-计时器触发时的奇怪行为_Azure_Azure Functions_Scheduled Tasks_Azure Webjobs_Timer Trigger - Fatal编程技术网

Azure函数和WebJob-计时器触发时的奇怪行为

Azure函数和WebJob-计时器触发时的奇怪行为,azure,azure-functions,scheduled-tasks,azure-webjobs,timer-trigger,Azure,Azure Functions,Scheduled Tasks,Azure Webjobs,Timer Trigger,我正在Azure上试验两种基于.NET Framework的机制,它们可以被定时器触发:Azure Function v1和WebJob。AF部署在Function App上,WebJob部署在Api App上。两者都有自由计划集 我希望通过CRON计划(使用“0*/10****(每10分钟一次)”重复运行一些测试代码(控制台中的1行)将是一项简单的任务。看来不是这样 注意:在开始实验之前,通过测试队列触发的WebJob,我已经知道应该将连续WebJob设置为“始终打开”,以防止在大约一小时后睡

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

我希望通过CRON计划(使用“0*/10****(每10分钟一次)”重复运行一些测试代码(控制台中的1行)将是一项简单的任务。看来不是这样

注意:在开始实验之前,通过测试队列触发的WebJob,我已经知道应该将连续WebJob设置为“始终打开”,以防止在大约一小时后睡觉。但这不能在免费和共享计划上启用。但是,在队列触发的WebJob上,我通过每次向队列添加新消息时向应用程序发送一个经过身份验证的请求来唤醒它,从而创建了一个变通方法。这样,我可以确保WebJob在有一些工作要做(即,要处理的队列消息)时不会休眠

然而,我认为计时器触发的WebJob不应该是“连续的”,而应该是“触发的”。但当我将其部署为“触发式”时,会出现以下错误:

(内部异常#0)ExitCode:-1,输出:命令'cmd/c “HeartbeatW…”已中止,原因是“”没有输出或CPU活动 121秒。您可以增加SCM\u命令\u空闲\u超时应用程序设置 (或WEBJOBS\u IDLE\u 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部署为“连续”而不是“触发”可以防止此错误,但仍存在两个问题:

  • 部署后,我需要转到门户并选择“运行”以启动WebJob-我还没有发现这是否可以自动化,或者我是否必须切换到付费计划
  • WebJob在运行一个小时左右后就会进入睡眠状态(因为它是按免费计划运行的,不能设置为“始终打开”),而我这次没有办法唤醒它,因为没有手动操作
更进一步说Azure功能,情况会变得更糟。如果我部署我的功能,请等待一段时间,然后转到功能监视器,我可以看到该功能没有在预期的时间段上运行。但是,如果我保持监视器视图打开,那么我可以看到函数现在已经开始按照计划运行了!因此,我猜查看日志会触发函数唤醒,就像向应用程序发送经过身份验证的请求对WebJob一样。至少它会运行一个小时左右,因为在这之后,函数日志不会显示新的运行

我读到Azure函数和WebJob都在同一个计划程序中运行。这是Azure函数的这种行为的原因吗


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

您的案例在门户中不正常。既然我对你的项目没有把握,那就让我们一步一步地再做一遍


.NET Framework 4.7.2上的WebJob sdk

 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();
     }
 }
  • 在Visual Studio中创建基于.net framework 4.7.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();
         }
     }
    
  • 本地测试,未发现作业功能。

  • 在项目中添加功能:右键单击项目->添加->新项目->Class.cs->将其重命名为功能。这里有一个每分钟运行一次的函数

     public static void ProcessTimerTrigger([TimerTrigger("0 * * * * *")] TimerInfo myTimer, ILogger logger)
             {
                 logger.LogInformation("Message from Class1.");
             }
    
  • 安装所需的软件包。以下是我使用的一些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" />
    
  • 在本地运行。成功地


  • 作为WebJob部署到门户。成功地

  • 对于函数,即使您不打开日志,它也在运行。您可以在许多地方进行检查,例如度量、kudu日志文件(
    https://yourapp.scm.azurewebsites.net/DebugConsole
    ->日志文件->应用程序->函数->函数->您的函数名->文件)

  • 顺便说一下,当发布控制台应用程序为WebJob时,请选择“连续运行”


    参考资料:

    您能否在本地计算机上成功运行脚本?您使用的.NET Framework版本是什么?@DorisLv是的,程序并不复杂,它们只有一行长,这是控制台的日志。在.NET Framework 4.7.2上的WebJob,在.NET Framework 4.6.1上的函数我发布了我这边的工作原理,希望它能对您有所帮助@马里乌斯·伊格纳托维奇