【问题标题】:Whats is the difference between 'Settings.job' and 'TimerTrigger' in Azure WebJobs SDK 3.0Azure WebJobs SDK 3.0 中的“Settings.job”和“TimerTrigger”有什么区别
【发布时间】:2021-01-01 18:14:29
【问题描述】:

有许多教程使用以下代码通过 WebJob SDK 3.0 库创建 Webjobs。特别是'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 文件时,我已经设法让 webjob 工作。

setting.job: {  "schedule": "0 */1 * * * *" }

我的问题是这两者有什么不同?

【问题讨论】:

    标签: azure azure-webjobs


    【解决方案1】:

    更新:

    请到azure webjobs log,然后你可以看到它实际上是按照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 core 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 中定义的计划运行。

    【讨论】:

    • 感谢您的解释。我复制了与原始代码相同的代码。但是,在发布 Web 作业时,它会出现在 azure 网站中,但计划为“N/A”,并且不会在 blob 存储中创建任何文件夹。在本地运行它工作正常。我觉得奇怪的是 SDK 实际上会在发布时生成一个空白的 settings.job 文件,而该作业的唯一工作方式是向该文件添加计划。 (SDK 3.04 版)
    • @JasonClark,您添加 appsettings.json 文件(添加 AzureWebJobsStorage 及其值)并右键单击该文件 -> 将“复制到输出目录”设置为“如果较新则复制”?
    • @JasonClark,我只是将它发布到 azure,我使用的包 Microsoft.Azure.WebJobs 是 3.0.8。是的,发布到 azure 后,settings.job 文件是空白的,并且计划是 N/A,但是当您转到 azure webjobs 日志时,您可以看到它按 SDK 计划运行。我会用截图更新答案。
    • 是的,我有这个配置。在将作业发布为“连续”而不是触发时,我确实设法让网络作业正常工作。
    • @JasonClark,它实际上是按照 SDK 定义的 timeTrigger 运行的,详情请查看 webjobs 日志。而且我还更新了我的答案,您可以看到它按计划运行(即使计划是 n/a,并且 settings.job 是空白的,也没关系)。
    【解决方案2】:

    我一直在努力解决同样的问题。这是我经过长时间研究后的理解。

    有两种Webjobs:

    • 已触发
    • 连续

    触发的必须手动触发,也可以由应用服务根据setting.job 中提供的 CRON 表达式计划触发。这些作业一旦不运行就不会出现在内存中。

    连续一个总是运行,所以进程一直存在于内存中。您可以使用 Webjobs SKD TimeTrigger 属性来安排它。

    您还会注意到仪表板中这两种 Web 作业类型之间的区别。 对于触发的 Web 作业,您将看到顶级作业运行,然后调用函数并最终调用详细信息。 对于连续 Web 作业,这将是调用的函数和最终的调用细节。缺少作业运行,因为这只是一项长期运行的作业。

    检查 Kudu w3wp 进程下的 App Service / Process explorer 以查看正在运行的 Webjobs 进程。

    请注意,必须在您提供配置的Main 方法中以不同的方式启动连续和触发的Webjobs。当通过 Visual Studio 添加特定类型的 Webjob 时,所有这些都已配置。

    这是基于 WebJobs 2.x.

    我的建议是

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

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 2019-08-08
      • 1970-01-01
      • 2016-04-12
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多