目录

 

 

Trigger

属性

SimpleTrigger

CronTrigger

 

Trigger、Job、Schedule Listiners

JobStore

RAMJobStore

ADO.NET Job Store(AdoJobStore)


Trigger

属性

所有Trigger都实现ITrigger,看下ITrigger就能知道Trigger的基本属性

TriggerKey  最开始的示例代码有,是Trigger的Identity

JobDataMap  上面提到过

JobKey  关联对应JobKey的Job

StartTimeUtc  Trigger如果多次触发,那么从这一天开始(例如设置了2020年6月30号,那么2020年6月30号之前是不会触发的)

EndTimeUtc  同上,从这一天结束,不再触发Trigger

Priority  默认是5,多个Trigger同时触发,竞争线程的时候,Priority越大执行优先度越高

MisFire Instructions 当多个trigger同时触发,有的trigger不能及时触发,会出现misfire instructions 不同的trigger type对应不同的misfire 之后再讲

Calendars  实现了ICalendar接口的类对象,可以用来排除特定日期(比如Trigger设置的每天执行,但是用来排除特定的节假日!)

使用scheduler的AddCalendar方法来初始化Calendar,(官方提供HolidayCalendar来排除节假日,TODO)

quartz.impl.calendar明明空间提供了一系列的ICalendar实现类,可能会满足需求(TODO)

SimpleTrigger

正如命名所示,较为简单的场景可以使用SimpleTrigger就可以了(单次执行的任务  和  按照简单规则多次执行的任务)

需要使用WithSimpleSchedule方法

可以看到源代码中定义如下:

public static TriggerBuilder WithSimpleSchedule(this TriggerBuilder triggerBuilder, Action<SimpleScheduleBuilder> action);

WithSimpleSchedule是TriggerBuilder的一个扩展方法,需要一个Action参数

示例:

class Program
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler=await schedulerFactory.GetScheduler();
            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<TestJob>()
                .WithIdentity("testJob", "testGroup")
                .Build();
            
            //每5秒执行1次(WithInternvalInSeconds)
            //重复2次(一共执行3次,如果WithRepeatCount是0,那么只会执行1次!)
            //从现在开始10秒后触发(StartAt)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithSimpleSchedule(x=>x.WithIntervalInSeconds(5).WithRepeatCount(2))
                .StartAt(DateTime.Now.AddSeconds(10))
                .Build();

            await scheduler.ScheduleJob(job, trigger);
            Console.ReadLine();
        }
    }

    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync("executeJob:"+ DateTime.Now.ToString("HH:mm:ss"));//每5秒打印一次 一共打印了3次 第一次距main方法10秒
        }
    }

上面的WithRepeatCount 方法指定了重复的次数,使用RepeatForever方法可以永远执行下去

 在WithSimpleSchedule方法中可以手动指定MisfirePolicy,所有的trigger默认都使用smart policy,也可以手动指定

x=>x.WithMisfireXXXXX  这样的形式来指定

DateBuilder是quartz提供的一个时间工具类,可以很方便的构建一个日期,配合StartAt方法使用!

CronTrigger

可以使用cron表达式的复杂Trigger

所有的触发情况基本都可以使用CronTrigger来满足需求(需要反复执行的任务)

在线Cron表达式生成地址:https://qqe2.com/cron

一个简单的cron表达式示例:

0 30 23 * * ? 

代表每天晚上23:30:00会出发一次trigger

Cron表达式包含7个部分,每个部分用空格隔开:

  • 秒
  • 分
  • 小时
  • 日(每月第几天)
  • 月份
  • 周(每周第几天)
  • 年份(可以省略)

cron表达式这里就不再展开了,反正可以直接在线生成~~~

创建CronTrigger的方法:

使用TriggerBuilder的Build方法,创建过程中使用WithCronSchedule方法

也可以直接使用WithSchedule方法使用CronScheduleBuilder

WithCronSchedule示例:

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithCronSchedule("0/5 * * * * ? ")
                .StartAt(DateTime.Now.AddSeconds(5))
                .Build();//从每分钟的0秒开始 每5秒执行一次  (开始时间是startat指定时间)

CronScheduleBuilder示例:

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(23,30))
                .Build();//每天23:30执行一次

注意有一个InTimeZone方法,可以让出发时间不按照系统时间来计算,而是按照指定的TimeZone来

Misfire属性用法和SimpleTrigger差不多,也是在WithCronSchedule中指定,这里先不详细说。

 

Trigger、Job、Schedule Listiners

自定义监听器基本用不到。

可以自定义Tigger和Job的监听器,分别实现ITriggerListener和IJobListener接口就可以了,

也可也选择继承TriggerListenerSupport和JobListenterSupport类,然后只override需要修改的event就可以了。

可以监听Trigger的Fire、Misfire、Complete(job完成了)

和Job的 将要执行前(to be executed) 、完成执行(completed execution)

自定义监听器在scheduler的ListennerManager上注册(运行时注册),必须要指定Name属性!

scheduler.ListenerManager.AddJobListner(.......);

注意:自定义的监听器,不允许抛出异常,所有异常需要在内部用try catch解决,否则会导致程序失败!

 ISchedulerListener是自定义scheduler监听器要实现的接口,也使用scheduler的ListenerManager注册(AddSchedulerListener方法)

监听scheduler的   添加job/trigger、移除job/trigger、shutdown通知、内部报错等等

JobStore

jobstore是用来存储scheduler相关的 数据(jobs、triggers、calendars等等)

注意不要在业务代码中使用JobStore,一开始配置好就行了(配置SchedulerFactory),大部分情况不要去配置

RAMJobStore

 Quartz框架默认使用RAMJobStore,正如命名一样,它保证数据都存储在内存中。

一把情况当你使用StdSchedulerFactory的时候,不需要指定使用RAMJobStore(quartz.jobStore.Type=Quartz.Simpl.RAMJobStore)

当然存在内存中,重启就没了。

ADO.NET Job Store(AdoJobStore)

如名称所述,将状态数据存数据库里面,因为这样访问硬盘了所以速度远比ram慢,要设置Ado

先要在数据库里面跑一下官方提供的脚步来创建相应的数据库表(官方项目的database/dbtables文件夹下,所有表QRTZ_开头)

JobStoreTX是这时候要使用的adojobstore实现类。配置方法如下:

quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz

DriverDelegate负责完成与数据库交互(ADO.NET)相关的工作,配置方法如下:(STDAdoDelegate是系统提供的实现)

quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz

配置数据库前缀(默认是QRTZ_, 你也可以自己修改数据库)

quartz.jobStore.tablePrefix = QRTZ_

 配置Data Source

quartz.jobStore.dataSource = myDS

 配置数据库连接示例:(sqlserver  mysql  oracle都支持)

 quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
 quartz.dataSource.myDS.provider = MySql

 官方建议将userProperties属性设置为true,JobDataMap里面的参数全部都要是字符串

quartz.jobStore.useProperties = true
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐