Web开发:使用Quartz库结合WebAPI根据任务列表定时执行相应逻辑

发布于:2025-09-02 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、实体及文件结构

public class JobSchedule
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Cron { get; set; }
}

二、服务类

后台服务类初始化时会调用此类的StartAsync方法

public class QuartzService : IQuartzService
{
    private readonly IScheduler _scheduler;
    public QuartzService(IJobFactory jobFactory) // 接收 IJobFactory
    {
        var schedulerFactory = new StdSchedulerFactory();
        _scheduler = schedulerFactory.GetScheduler().Result;

        // 设置自定义 JobFactory
        _scheduler.JobFactory = jobFactory;

    }

    public async Task StartAsync()
    {
        await _scheduler.Start();
        //模拟通过查库获得任务列表(实际可以通过注入IFreeSql等方式获取)
        List<JobSchedule> list = new List<JobSchedule>
        {
            new JobSchedule
            {
                Id = Guid.NewGuid().ToString(),
                Title = "每间隔3s打印一次时间",
                Cron = "0/3 * * * * ?"
            },
            new JobSchedule
            {
                Id = Guid.NewGuid().ToString(),
                Title = "每间隔15s打印一次时间",
                Cron = "0/15 * * * * ?"
            }
        };

        foreach (var jobSchedule in list)
        {
            var job = JobBuilder
                .Create<PrintTimeJob>() // 使用泛型方式
                //.Create(Type.GetType("WebApplication1.Controllers.Quartz.PrintTimeJob")) //使用命名空间+类名方式
                .WithIdentity(jobSchedule.Id)
                .UsingJobData("title", jobSchedule.Title)//传递参数到逻辑方法PrintTimeJob中
                .Build();

            var trigger = TriggerBuilder
                .Create()
                .WithIdentity($"{jobSchedule.Id}.trigger")
                .WithCronSchedule(jobSchedule.Cron)
                .StartNow()
                .Build();

            await _scheduler.ScheduleJob(job, trigger);
        }
    }

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

三、后台服务类

初始化的关键在配置(Startup.cs)中

public class QuartzHostedService : IHostedService
{
    private readonly IQuartzService _quartzService;

    public QuartzHostedService(IQuartzService quartzService)
    {
        _quartzService = quartzService;
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        await _quartzService.StartAsync();
    }

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

四、任务逻辑方法

实现IJob,会根据Cron表达式定时执行该方法(服务类已注册)

下面的注入IFreesql只是一个示例,表达的意思是可以查库

/// <summary>
/// 逻辑方法
/// </summary>
public class PrintTimeJob : IJob
{
    private readonly IFreeSql _freeSql;
    public PrintTimeJob(IFreeSql freeSql)
    {
        _freeSql = freeSql;
    }
    public async Task Execute(IJobExecutionContext context)
    {
        var q = await _freeSql.Ado.QueryAsync<string>("select id from city");
        var title = context.JobDetail.JobDataMap.GetString("title");
        Console.WriteLine($"{title}: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
        await Task.CompletedTask;
    }
}


五、Startup.cs配置

public void ConfigureServices(IServiceCollection services)
{
    //省略其他不相关代码

    // 注册Quartz相关服务
    services.AddQuartz();//Quartz框架添加到依赖注入容器
    services.AddSingleton<IQuartzService, QuartzService>();//自己编写的服务类
    services.AddHostedService<QuartzHostedService>();//自己编写的后台服务类,初始化时会调用上面这个服务类
}

六、效果


网站公告

今日签到

点亮在社区的每一天
去签到