如果Azure WebJobs SDK 3.0中的'Settings.job'和'TimerTrigger'之间的区别怎么办

时间:2019-06-11 16:52:04

标签: azure-webjobs

许多教程使用以下代码通过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 * * * *" }

我的问题是这两者之间有什么区别?

2 个答案:

答案 0 :(得分:1)

更新:

请转到azure webjobs日志,然后您可以看到它实际上按照SDK定义的timerTrigger运行(即使Schedule为n / a,并且settings.job为空白,也没有关系):

enter image description here

简而言之,当使用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分钟触发一次函数:

enter image description here

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的。

我的建议是

  • 触发定期(例如,每隔几小时,几天一次)作业使用 一个,不运行的作业不会消耗资源,
  • 对于更频繁的工作,请使用带有TimeTrigger的连续工作 属性,它将一直消耗资源,但不需要 额外的启动时间。