许多教程使用以下代码通过WebJob SDK 3.0库创建Webjob。特别是“ TimerTrigger”
public void DoSomethingUseful([TimerTrigger("0 */1 * * * *", RunOnStartup = false)] TimerInfo timerInfo, TextWriter log)
{
// Act on the DI-ed class:
string thing = _usefulRepository.GetFoo();
Console.WriteLine($"{DateTime.Now} - {thing}");
}
上面的示例应每1分钟作为Webjob运行一次此方法。但是,这不起作用。
当包含setting.job文件时,我设法使网络作业正常工作。
setting.job: { "schedule": "0 */1 * * * *" }
我的问题是这两者之间有什么区别?
答案 0 :(得分:1)
更新:
请转到azure webjobs日志,然后您可以看到它实际上按照SDK定义的timerTrigger运行(即使Schedule为n / a,并且settings.job为空白,也没有关系):>
简而言之,当使用webjob sdk 3.x时,可以根据您定义的时间使用TimerTrigger
属性来运行该函数。无需使用webjobs SDK(例如使用.zip文件或从Visual Studio中发布控制台项目),就可以使用setting.job来定义计时器,而不是使用TimerTrigger
属性。
1。使用webjobs SDK 3.x进行计时器触发时,应添加以下代码行:config.AddTimers();
。
这是我使用webjobs SDK 3.x(这是在Visual Studio中创建的.net核心2.2控制台项目)的代码:
最新版本的软件包:Microsoft.Azure.WebJobs
/ Microsoft.Azure.WebJobs.Extensions
/ Microsoft.Extensions.Logging.Console
Program.cs中的代码:
class Program
{
static void Main(string[] args)
{
var builder = new HostBuilder()
.ConfigureWebJobs(config =>
{
config.AddTimers();
config.AddAzureStorageCoreServices();
})
.ConfigureLogging((context, b) =>
{
b.AddConsole();
}
)
.Build();
builder.Run();
}
}
然后创建一个新文件,例如SayHelloWebJob.cs,并在其中进行编码:
public class SayHelloWebJob
{
public void ProcessCollateFiles([TimerTrigger("0 */1 * * * *", RunOnStartup = false)]TimerInfo timerInfo,TextWriter writer)
{
writer.WriteLine("hi, it is a testing running");
Console.WriteLine("test");
}
}
请注意,在appsettings.json文件中,添加存储连接字符串,如下所示:
{
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net"
}
然后运行项目,您可以看到每1分钟触发一次函数:
2。对于settings.job,例如如果您只是创建一个控制台项目,而不使用webjobs sdk。由于您没有使用webjobs sdk,因此无法使用timerTrigger属性。目前,您可以在此项目中包含settings.job文件(在其属性中,将“复制到输出目录”设置为“如果更新则复制”),并像在帖子中一样配置计划的计时器。作为Webjob发布后(从Visual Studio中发布时,在发布时,将“ Webjob运行模式”选择为“按需运行”),它可以按照您在settings.job中定义的计划运行。
答案 1 :(得分:1)
我一直在努力解决同样的问题。经过长时间的研究,这是我的理解。
有两种Webjob:
已触发的事件必须手动触发,也可以根据setting.job
中提供的CRON表达式时间表由App Service触发。一旦不运行,这些作业就不会出现在内存中。
连续运行总是运行,因此该进程一直存在于内存中。您可以使用Webjobs SKD TimeTrigger
属性来安排它。
您还将在仪表板中注意到这两种Webjob类型之间的差异。 对于触发的Web作业,您将在顶级作业上看到运行,然后调用了函数并最终调用了详细信息。 对于连续的Webjob,将调用函数并最终调用细节。缺少工作运行,因为这只是一项长期运行的工作。
在Kudu w3wp进程下检查App Service / Process Explorer,以查看Webjobs进程正在运行。
请注意,必须在提供配置的Main
方法中以不同的方式启动连续和触发的Webjob。通过Visual Studio添加特定类型的Webjob时,全部配置完毕。
这是基于WebJobs 2.x的。
我的建议是