Azure函数和WebJob-计时器触发时的奇怪行为
我正在Azure上试验两种基于.NET Framework的机制,它们可以被定时器触发:Azure Function v1和WebJob。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)如果需要 我不确定增加超时有什么帮助,也不确定应该设置哪个值,但我的主代码可能有问题: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设置为“始终打开”,以防止在大约一小时后睡
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在运行一个小时左右后就会进入睡眠状态(因为它是按免费计划运行的,不能设置为“始终打开”),而我这次没有办法唤醒它,因为没有手动操作
所有这些都是设计的,不能改变吗?或者我应该在部署过程中进行一些调整吗?您的案例在门户中不正常。既然我对你的项目没有把握,那就让我们一步一步地再做一遍
.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();
}
}
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();
}
}
public static void ProcessTimerTrigger([TimerTrigger("0 * * * * *")] TimerInfo myTimer, ILogger logger)
{
logger.LogInformation("Message from Class1.");
}
<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" />
https://yourapp.scm.azurewebsites.net/DebugConsole
->日志文件->应用程序->函数->函数->您的函数名->文件)顺便说一下,当发布控制台应用程序为WebJob时,请选择“连续运行”
参考资料:您能否在本地计算机上成功运行脚本?您使用的.NET Framework版本是什么?@DorisLv是的,程序并不复杂,它们只有一行长,这是控制台的日志。在.NET Framework 4.7.2上的WebJob,在.NET Framework 4.6.1上的函数我发布了我这边的工作原理,希望它能对您有所帮助@马里乌斯·伊格纳托维奇