Azure WebJobs SDK 3.0 中的“Settings.job”和“TimerTrigger”有什么区别

Jas*_*ark 2 azure azure-webjobs

有很多教程使用以下代码通过 WebJob SDK 3.0 库创建 Webjobs。特别是“定时器触发器”

    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}");
    }
Run Code Online (Sandbox Code Playgroud)

上面的例子应该每 1 分钟将这个方法作为一个 webjob 运行一次。然而这行不通。

在包含 setting.job 文件时,我已经设法让 webjob 工作。

setting.job: {  "schedule": "0 */1 * * * *" }
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*ang 6

更新:

请转到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 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后创建一个新文件,如 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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

请注意,在 appsettings.json 文件中,添加您的存储连接字符串,如下所示:

{
  "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=xxx;EndpointSuffix=core.windows.net"
}
Run Code Online (Sandbox Code Playgroud)

然后运行项目,可以看到函数每1分钟触发一次:

在此处输入图片说明

2.对于settings.job,例如。如果您只是创建一个控制台项目,并且不使用 webjobs sdk。由于您没有使用 webjobs sdk,因此您不能使用 timerTrigger 属性。此时,您可以在此项目中包含 settings.job 文件(在其属性中,将“复制到输出目录”设置为“如果更新则复制”)并像您在帖子中所做的那样配置计划的计时器。发布为 webjob 后(来自 Visual Studio,发布时,选择“Webjob 运行模式”为“按需运行”),它可以按照您在 settings.job 中定义的计划运行。