Azure WebJobs 与 Quartz.NET

Azure WebJobs vs Quartz.NET

提问人:Mihai Socaciu 提问时间:11/15/2023 更新时间:11/17/2023 访问量:79

问:

如果我的应用程序中有一个 WebJob 项目,并在 Azure 云中设置了 CRON 表达式,如下图所示,那么为什么需要包 Quartz.NET
WebJob 项目具有一个继承 BackgroundService 的类,并调用 AddHostedService。

enter image description here

我的发现

1. Quartz.NET
a. 的可能缺点。是否可以将 Quartz.NET 与 Azure 存储队列、表等一起使用?如果没有,这将是一个缺点。
b. Quartz.NET 似乎只关注时间安排。如果我希望后台任务不是从时间触发器触发的,那么 Quartz.NET 没有用?

2. Quartz.NET 的可能优势
我知道您可以使用 Quartz 创建多个工作。在一个简单的 WebJob 中,我必须为每个 Web 作业重复添加 HostedService。

for (int i = 0; i < workerConfiguration.WorkerCount; i++)
{
   services.AddHostedService<BackgroundTaskService>();
}
C# asp.net azure-webjobs quartz.net background-service

评论


答:

0赞 Suresh Chikkam 11/16/2023 #1

如果应用程序中有一个 WebJob 项目,并且用例是在 Azure 云中设置 CRON 表达式,则可能不需要 .NET Quartz_包,并且该类是 .NET Core 框架的一部分,并提供了一种在托管服务中运行后台任务的方法。BackgroundService

b. Quartz.NET 似乎只关注时间安排。如果我希望后台任务不是从时间触发器触发的,那么 Quartz.NET 没有用?

一个。是否可以将 Quartz.NET 与 Azure 存储队列、表等一起使用?如果没有,这将是一个缺点。

  • Quartz_.NET 提供了一种与不同作业存储(包括 Azure 存储)集成的方法。可以使用该包将作业数据存储在 Azure 表存储中,也可以使用包将作业数据存储在 Azure 存储队列中。Quartz.Plugins.AzureTable.AdoJobStoreQuartz.Plugins.AzureQueue.AdoJobStore

使用 method 计划具有不同触发器的多个作业。IScheduler.ScheduleJob

下面是一个示例:

using Microsoft.Extensions.Hosting;
using Quartz;
using System;
using System.Threading;
using System.Threading.Tasks;

public class QuartzHostedService : IHostedService
{
    private readonly IScheduler _scheduler;

    public QuartzHostedService(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        await _scheduler.Start(cancellationToken);

        // Schedule Job1 every 5 minutes
        var job1 = JobBuilder.Create<Job1>()
            .WithIdentity("job1", "group1")
            .Build();

        var trigger1 = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .WithCronSchedule("0 0/5 * * * ?")
            .Build();

        await _scheduler.ScheduleJob(job1, trigger1, cancellationToken);

        // Schedule Job2 every 10 minutes
        var job2 = JobBuilder.Create<Job2>()
            .WithIdentity("job2", "group1")
            .Build();

        var trigger2 = TriggerBuilder.Create()
            .WithIdentity("trigger2", "group1")
            .WithCronSchedule("0 0/10 * * * ?")
            .Build();

        await _scheduler.ScheduleJob(job2, trigger2, cancellationToken);
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        await _scheduler.Shutdown(cancellationToken);
    }
}