第四节: Quartz.Net五大构件之Trigger通用用法(常用方法、优先级、与job关联等)

一. 简介

1. 几个类型:

  ①:TriggerBuilder:用来创建ITrigger实例

  ②:ITrigger:触发器实例

2.常用的几个方法

  ①.StartNow:Trigger马上触发.

  ②.StartAt和EndAt:设置Trigger触发的开始时间和结束时间 (省略设置开始时间的话,默认从当前时间开始执行)

  ③.UsingJobData:给Trigger添加一些附加值(通过context.Trigger.JobDataMap获取)

  ④.WithDescription:用来描述该触发器,并没有什么实际左右

  ⑤.WithPriority:设置Trigger的优先级,默认为5,数字越大,优先级越高.(该优先级用于一个job对应多个Trigger,且Trigger的触发时间相同,优先级越大的越先执行)

  ⑥.ForJob:将job和trigger进行关联,该方法有多个重载,关联后ScheduleJob方法进行调度时,只需将trigger传入进去即可

 

二.  Job和Trigger关联问题

(1). 1个job对应1个trigger:调用ScheduleJob(IJobDetail jobDetail, ITrigger trigger),直接关联即可,无须做特别处理

(2). 1个job对应多个trigger:有两种方案解决

  方案A: 将job持久化(StoreDurably(true)),然后通过AddJob方法加入调度池中,Trigger上通过ForJob方法和指定job进行关联,然后调用ScheduleJob(ITrigger trigger)方法,将trigger全部加入调度池中,最后Start开启即可

  方案B: 创建job和trigger都不需要关联,也不需要特殊设置,最后将trigger加入一个HashSet<ITrigger>池中,通过一次性通过 ScheduleJob(IJobDetail jobDetail, Collection.ISet<ITrigger> triggersForJob, bool replace)进行关联

(3). 2个job对应1个trigger (不常用)

  利用JobChainingJobListener实现

//1. 创建Schedule
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            //2. 创建Job
            var job1 = JobBuilder.Create<HelloJob3>()
                    .WithIdentity("job1", "jobGroup1")
                    .StoreDurably(true)
                    .Build();
            var job2 = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job2", "jobGroup2")
                    .StoreDurably(true)
                    .Build();
            /********************************* 下面测试job和 Trigger的关联问题  (与下面Trigger优先级的测试互不影响)**************************************/

            #region 情况1:1个job对应1个trigger
            {
                var trigger = TriggerBuilder.Create()
                                  .UsingJobData("name", "ypf1")   //附加信息
                                  .UsingJobData("age", "age1")
                                  .StartAt(DateBuilder.EvenSecondDateAfterNow()) //表示下一个秒整点开启,比如现在9点19分20秒,那么9点20分21s整开启 
                                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())
                                  .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后结束
                                  .Build();
                scheduler.ScheduleJob(job1, trigger);
                scheduler.Start();
            }
            #endregion

            #region 情况2:1个job对应多个Trigger
            //方案1
            {
                var trigger1 = TriggerBuilder.Create()
                                 .UsingJobData("name", "ypf1")   //附加信息
                                 .UsingJobData("age", "age1")
                                 .StartNow()     //马上开启
                                 .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())    //每隔两秒执行一次
                                 .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后结束
                                 .ForJob("job1", "jobGroup1")    //通过表名和组名进行关联
                                 .Build();
                var trigger2 = TriggerBuilder.Create()
                               .UsingJobData("name", "ypf2")   //附加信息
                               .UsingJobData("age", "age2")
                               .StartNow()     //马上开启
                               .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())      //每隔5秒执行一次
                               .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后结束
                               .ForJob(job1)    //直接IJobDetail关联
                               .Build();

                scheduler.AddJob(job1, true);
                scheduler.ScheduleJob(trigger1);
                scheduler.ScheduleJob(trigger2);
                scheduler.Start();
            }
            //方案2
            {
                var trigger1 = TriggerBuilder.Create()
                                 .UsingJobData("name", "ypf1")   //附加信息
                                 .UsingJobData("age", "age1")
                                 .StartNow()     //马上开启
                                 .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())    //每隔两秒执行一次
                                 .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后结束
                                 .Build();
                var trigger2 = TriggerBuilder.Create()
                               .UsingJobData("name", "ypf2")   //附加信息
                               .UsingJobData("age", "age2")
                               .StartNow()     //马上开启
                               .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())      //每隔5秒执行一次
                               .EndAt(DateTimeOffset.Now.AddSeconds(60))    //60s后结束
                               .Build();

                Quartz.Collection.HashSet<ITrigger> triggerHash = new Quartz.Collection.HashSet<ITrigger>();
                triggerHash.Add(trigger1);
                triggerHash.Add(trigger2);
                scheduler.ScheduleJob(job1, triggerHash, true);
                scheduler.Start();
            }
            #endregion

            #region 情况3:2个job对应1个trigger 
            {
                //每s执行一次
                var trigger = TriggerBuilder.Create().WithCronSchedule("/1 * * * * ?").Build();

                JobChainingJobListener listener = new JobChainingJobListener("mytest");
                listener.AddJobChainLink(job1.Key, job2.Key);
                scheduler.ListenerManager.AddJobListener(listener);

                scheduler.AddJob(job2, true);
                scheduler.ScheduleJob(job1, trigger);
                scheduler.Start();
            }
            #endregion

三. Trigger的优先级(未完)

 利用WithPriority方法,该优先级用于一个job对应多个Trigger,且Trigger的触发时间相同,优先级越大的越先执行。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值