栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > .Net

Net6中使用Quartz调度

.Net 更新时间:发布时间: 百科书网 趣学号
Net6中使用Quartz调度

首先创建 NetCore Web 应用(框架选择NET6.0)
首先引入Nuget包 Quartz

首先注入调度工厂

//注册服务
builder.Services.AddSingleton();

创建一个IOC服务类为了能够让我们访问到 注入容器中的其他注入信息,因为Quartz有一个默认的生成job的工厂类Quartz.Simpl.SimpleJobFactory

using Quartz;
using Quartz.Spi;

namespace QuzrtzJob.Factory
{
    public class IOCJobFactory : IJobFactory
    {
        private readonly IServiceProvider _serviceProvider;
        public IOCJobFactory(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob;

        }

        public void ReturnJob(IJob job)
        {
            var disposable = job as IDisposable;
            disposable?.Dispose();

        }
    }
}

完成这一步之后创建一个启动Quartz服务的服务类(这里我就写了个启动方法,按道理来说应该会有一个关闭方法)

using Quartz;
using Quartz.Spi;

namespace QuzrtzJob.Factory
{
    public class QuartzFactory
    {
    	//1、声明一个调度工厂
        private ISchedulerFactory _schedulerFactory;
        private IScheduler _scheduler=default;
        private IJobFactory _IOCjobFactory;
        public QuartzFactory(ISchedulerFactory schedulerFactory,IJobFactory jobFactory) {
            _schedulerFactory = schedulerFactory;            
            _IOCjobFactory = jobFactory;
        }
        public async Task Start()
        {            
            //2、通过调度工厂获得调度器
            _scheduler = await _schedulerFactory.GetScheduler();
            //这里是指定容器仓库
            _scheduler.JobFactory = _IOCjobFactory;
            //3、开启调度器
            await _scheduler.Start();
            //4、创建一个触发器
            var trigger = TriggerBuilder.Create()
                            .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
                            .Build();
            //5、创建任务
            var jobDetail = JobBuilder.Create()
                            .WithIdentity("job", "group")
                            .Build();
            //6、将触发器和任务器绑定到调度器中
            await _scheduler.ScheduleJob(jobDetail, trigger);
            return await Task.FromResult("将触发器和任务器绑定到调度器中完成");
        }
    }
}

这个时候就应该创建自己的任务类了


该类必须继承IJob实现接口

Execute方法为调度方法每次执行也是执行这个方法

创建完成之后 让我们在返回 Program.cs 中 把刚才创建的 类都注入到 容器中

builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();

准备完毕、在启动应用的时候调用 服务类中的启动方法 Start (在Program.cs)

//这里也可以加入是否启动 Quartz是否启动
if (true)
{
    //获取容器中的QuartzFactory
    var quartz = app.Services.GetRequiredService();
    app.Lifetime.ApplicationStarted.Register(async () =>
    {
       await quartz.Start();
    });

    app.Lifetime.ApplicationStopped.Register(() =>
    {
        //Quzrtz关闭方法
        //quartz.Stop();
    });
}

运行,不出意外的话就会执行 Execute方法 这里设置的两秒执行一次
如何更改执行时间呢,在Strat方法中可以使用

//这是2秒
.WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次
//也可以使用 Cron表达式
.WithCronSchedule("0/20 0/30 2,4 2-5 8 ?")

网上百度一搜索 Cron表达式生成器就有基本可以涵盖所有场景

参考 https://blog.csdn.net/qq_32688731/article/details/100773434

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/984942.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号