Quartz.net在.Net Core中使用

近来使用Quartz.net来实现定时作业调度,现记录一下使用流程。

关于Quartz的介绍和详细说明,请访问官网https://www.quartz-scheduler.net/

一、Quartz.net中主要有以下几个对象

1.StdSchedulerFactory(调度器工厂)用于创建调度

2.IScheduler (调度器)用于绑定任务和触发器进行工作

3.IJobDetail(任务)用于执行业务工作

4.ITrigger(触发器)用于指定在特定条件下执行任务

二、安装Quartz.AspNetCore包

三、Quartz.net实现作业调度有两种方式,配置文档方式和不用配置文档方式,以下将分别演示。

1.不用配置文档方式:

如果你的作业项目比较简单,一般只有一个任务或者一两个触发器,且以后不会改变触发策略或者添加任务,那么只需要几行代码来使用Quartz就好了。

        public static void Main(string[] args)
        {
            //任务,JobBLL即你的任务类
            IJobDetail jobDetail = JobBuilder.Create<MyJob>().WithIdentity("MyJob").Build();
            //cron时间策略
            ITrigger trigger = TriggerBuilder.Create().WithIdentity("Mytrigger").WithCronSchedule(CommonBLL.Config["system:cron"]).Build();
            //执行一次策略
            ITrigger nowTrigger = TriggerBuilder.Create().WithIdentity("now").StartNow().Build();
            //简单策略,每3秒执行一次,一共执行两次
            //ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(s => s.WithIntervalInSeconds(3).WithRepeatCount(2)).Build();
            //启动调度
            StdSchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = await factory.GetScheduler();
            //await scheduler.ScheduleJob(jobDetail, trigger);
            //绑定job和trigger,将任务与触发器添加到调度器中
            await scheduler.ScheduleJob(jobDetail, new List<ITrigger>() { trigger, nowTrigger }, replace: true);//多个trigger,立即执行&&按照既定cron时间策略
            //scheduler.ListenerManager.AddJobListener(new TestJobListener());//添加任务执行监控
            await scheduler.Start();//开启调度
        }
 [DisallowConcurrentExecution]//禁止同时执行任务
    public class MyJob:IJob
    {
        //实现Execute方法
        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() =>
            {
                Console.WriteLine("begin....");
                //你的作业部分
                Thread.Sleep(3000);
                Console.WriteLine("end...");
            });
        }
    }

其中,IJob的实现比较简单,将业务代码放在Job中的Execute方法中。

Trigger分为简单触发器和Cron方式,简单触发器一般指立即执行,或者每隔指定时间来执行这样的;Cron方式指可以使用Cron表达式来规定触发时间;Cron表达式的构建可以在网上找工具来构造:https://cron.qqe2.com/

2.配置文档方式

配置文档方式就是通过在配置文件中配置trigger和绑定策略方式,这样可以实现灵活配置;

(1)新增配置文件quartz.config

# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence

quartz.scheduler.instanceName = QuartzTest

# configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount = 10
quartz.threadPool.threadPriority = Normal

# job initialization plugin handles our xml reading, without it defaults are used
# quartz.plugin.triggHistory.type = Quartz.Plugin.History.LoggingJobHistoryPlugin
quartz.plugin.jobInitializer.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins
#配置文档路径
quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml

# export this server to remoting context
#quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
#quartz.scheduler.exporter.port = 555
#quartz.scheduler.exporter.bindName = QuartzScheduler
#quartz.scheduler.exporter.channelType = tcp
#quartz.scheduler.exporter.channelName = httpQuartz

其中主要是quartz.plugin.jobInitializer.fileNames这个属性是接下来的配置文件的路径,此外将该配置文件复制到输出目录设置为“始终复制”或者“较新赋值”,这样才可以生成到debug或release中。

(2)添加配置文件quartz_jobs.xml

<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 				version="2.0">
	<processing-directives>
		<overwrite-existing-data>true</overwrite-existing-data>
	</processing-directives>

	<schedule>
		<job>
			<name>MyJob</name>
			<description>MyJob测试任务</description>
			<!--指定作业实现类,格式为命名空间名.类名,程序集名称-->
			<job-type>QuartzConsole.MyJob, QuartzConsole</job-type>
		</job>
		<job>
			<name>HisJob</name>
			<description>HisJob测试任务</description>
			<job-type>QuartzConsole.HisJob, QuartzConsole</job-type>
		</job>
		<trigger>
			<simple>
				<name>simpleTrigger</name>
				<description>TestTrigger测试触发器</description>
				<job-name>MyJob</job-name>
				<!--作业重复次数,-1表示无限制重复执行-->
				<repeat-count>-1</repeat-count>
				<!--作业触发间隔时间,1000表示一秒执行一次-->
				<repeat-interval>3000</repeat-interval>
			</simple>
		</trigger>
		<trigger>
			<cron>
				<name>cronTrigger</name>
				<description>TestTrigger1测试触发器</description>
				<job-name>MyJob</job-name>
				<!--cron表达式-->
				<cron-expression>0/2 * * * * ?</cron-expression>
			</cron>
		</trigger>
		<trigger>
			<cron>
				<name>cronTrigger1</name>
				<description>TestTrigger1测试触发器</description>
				<job-name>HisJob</job-name>
				<cron-expression>0/1 * * * * ?</cron-expression>
			</cron>
		</trigger>
	</schedule>
</job-scheduling-data>

按照这样的配置节进行配置,其中<job>中为任务属性,trigger为触发器属性,具体的含义已在注释,当然还有很多配置变量,比如job-group或者trigger-group,还没用得到,所以不做使用;

(3)开启调度即可

     static void Main(string[] args)
        {
            //调度
            StdSchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = await factory.GetScheduler();
            await scheduler.Start();//开启调度
        }

这样在调度开启时候,调度自己去配置文件中检测任务及触发器;后续如果添加修改job或者trigger时候,就可以在配置文件中进行操作即可。

完,更多功能等用到再叙

 

 

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值