澳门新萄京官方文档翻译,更多关于Jobs和JobDet
分类:www.澳门新萄京赌场

当学完第3课之后,你喜欢的觉察,让jobs工作起来是依旧一定轻易的。纵然让jobs运行起来相当的粗略,对于其进行的要紧内容还是必要驾驭的。它们是IJob接口中的Execute和JobDetails。

当学完第二课之后,你欢欢悦喜的开掘,让jobs职业起来是依然1对一简单的。就算让jobs运维起来很轻易,对于其施行的关键内容还是须求领会的。它们是IJob接口中的Execute和JobDetails。

如你所见,Job万分轻便落成。这里只是介绍有关Jobs本质, IJob接口的Execute(..)方法以及JobDetails中须求领悟的内容。

The Quartz API

  1. IScheduler—与scheduler交互的第叁的接口

  2. IJob—那个接口首要定义scheduler试行内容

  3.  IJobDetail—用于定义Jobs实例

  4. ITrigger—定义scheduler怎么去实践Job

  5. JobBuilder –用于定义创设JobDetail实力,哪个定义为Jobs的实例

  6. TriggerBuilder—用于定义和塑造Trigger 实例

style="font-size: 1陆px;">为了越来越好的可读性,以下术语交替使用: IScheduler and Scheduler, IJob and Job, IJobDetail and JobDetail, ITrigger and Trigger.

 

Scheduler的生命周期是从它创造起来通过SchedulerFactory 到调用 Shutdown()后告竣。一旦Scheduler被创建,就可以调用add和remove方法来增多和移除乔布斯和Triggers以及别的调节相关的操作(举个例子暂停trigger)。假如未有调用 Start()方法,Scheduler并不会在任何triggers 下施行其它jobs。

 

Quartz定义壹种温馨的一定语言格式(称为DSL恐怕是fluent interface)在上1节中曾经看见如此使用它的事例,让大家再看2遍。

澳门新萄京 1澳门新萄京 2

 1 // define the job and tie it to our HelloJob class
 2     IJobDetail job = JobBuilder.Create<HelloJob>()
 3         .WithIdentity("myJob", "group1") // name "myJob", group "group1"
 4         .Build();
 5         
 6     // Trigger the job to run now, and then every 40 seconds
 7     ITrigger trigger = TriggerBuilder.Create()
 8         .WithIdentity("myTrigger", "group1")
 9         .StartNow()
10         .WithSimpleSchedule(x => x
11             .WithIntervalInSeconds(40)
12             .RepeatForever())            
13         .Build();
14         
15     // Tell quartz to schedule the job using our trigger
16     sched.scheduleJob(job, trigger)

View Code

在营造Job的代码块的时候使用JobBuilder ,使用fluent interfac成立这一个接口IJobDetail。同样营造trigger代码块使用TriggerBuilder’s 的fluent interface并调用扩充方法钦命trigger 类型。可用得时刻延长方法有:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

DateBuilder 类中隐含了各类方便塑造DateTimeOffset 实例的点子。(比方表示三个偶数的钟点换个具体点时间拾:00:00当下是玖:四三:2七)

Quartz 第一课 More About Jobs & JobDetails(官方文书档案翻译),quartzjobs

当学完第二课之后,你心满意足的觉察,让jobs职业起来是还是一定简单的。即便让jobs运转起来一点也不细略,对于其实行的主要内容依旧须求通晓的。它们是IJob接口中的Execute和JobDetails。

 

当你定义二个得以达成IJob接口的类的时候,你需求在里面落成实际要求实施的代码。Quartz.NET须要知道有关那代码的种种新闻,这样 Quartz.NET才具像你指望的那样行事。这么些细节是在JobDetail类中张开了描述,在上一节以及进行了简易的叙说。

 

JobDetail由JobBuilder举办实例化的。JobBuilder容许开拓人士使用 fluent interface.举办自定义JobDetail细节。

 

让我们花点时间看Job的体制以及在Quartz.NET中的生命周期。在首先节中一度观望的事例让我们再看1遍:

澳门新萄京 3 1 // define the job and tie it to our HelloJob class 2 IJobDetail job = JobBuilder.Create<HelloJob>() 3 .WithIdentity("myJob", "group1") 4 .Build(); 5 6 // Trigger the job to run now, and then every 40 seconds 7 ITrigger trigger = TriggerBuilder.Create() 8 .WithIdentity("myTrigger", "group1") 9 .StartNow() 10 .WithSimpleSchedule(x => x 11 .WithIntervalInSeconds(40) 12 .RepeatForever()) 13 .Build(); 14 15 sched.ScheduleJob(job, trigger); View Code

明天定义2个HelloJob 如下所示:

1 public class HelloJob : IJob
2 {
3     public void Execute(IJobExecutionContext context)
4     {
5         Console.WriteLine("HelloJob is executing.");
6     }
7 }

请留意,在此处给scheduler 2个IJobDetail 实例,它只须求二个job实例就会进行运作。当scheduler施行job的时候,scheduler 会在调用Execute方法在此以前实例化3个job实例。 能实例化job的前提是job类中需求有个无参的构造函数。还有一个内需专注的是,在job类中定义任何数据字段其实未有啥太大的意思,因为在job的运维期间不会保留那个数据字段。

 

总的来看这你或许会问,这我如何为三个job提供属性和配备音讯吗?并且这么能跟踪保持job的履汇兑况吧?要回答这一个题材,关键要弄懂JobDataMap,它是JobDetail中的一有的。

 

 

 

在所达成的类成为真正的“Job”时,期望任务所负有的种种质量要求文告给Quartz。通过JobDetail类能够成功那个专门的学业,这几个类在前边的章节中曾粗略聊起过。现在,大家花一些时光来谈谈Quartz中乔布斯的本来面目和Job实例的生命周期。首先让大家回看一下率先课中所看到的代码片断:

Jobs and Triggers

Job达成IJob 接口,接口里面仅有2个简便的章程

IJob Interface

1 namespace Quartz
2     {
3         public interface IJob
4         {
5             void Execute(JobExecutionContext context);
6         }
7 }

当trigger 触发时,scheduler’的线程调用Execute()方法。 JobExecutionContext 对象提供了Job实例以及运维时的条件音讯由Scheduler 去实行,1个Trigger 被触发对于本次实践还包罗JobDetail 对象以及别的项。

当scheduler增多三个Job的时候,scheduler会创造JobDetail 对象。它包涵了Job的种种品质设置,作为3个JobDataMap保存,它能够用来存款和储蓄状态新闻为Job实例。它实质上是学业job的定义。细节在下1节课进行了座谈。

接触对象用于触发Job的进行。当您希望实践贰个job,你实例化一个trigger 和'调'其性子为您愿意调治。触发器也说不定有二个与之相关的JobDataMap的

那是将参数字传送递给job特定于触发器的发用的。Quartz 附带常用的trigger 类型,,最常用的项目有SimpleTrigger(ISimpleTrigge接口r)和CronTrigger(ICronTrigger接口)。

SimpleTrigger是最有利于的,假使您须求'三回性'施行(在加以时刻的job只是单纯的实施),恐怕只要您要求在给按期期工作,并将其再次N次,延迟T施行之间。若是您愿意基于日历般的时间触发CronTrigger是卓有功效的

  • “每月二十九日10:一五”,“种种周二,晚上”。

干什么要有jobs和Triggers呢?多数 job schedulers并不曾 jobs and triggers概念。一些定义“job”作为轻松地用部分小job标志符沿实施时间(或布署)。其余人则很像Quartz’s job and trigger 对象集结。在付出Quartz,大家以为那是有含义的创始要在那么些时间表试行的时间表和办事时期的分别。那样做(在大家看来)多数益处。

譬如,Jobs能够被创立并能独立存储在 job scheduler,并且多数triggers 能够用同样的job相关联。那种松耦合的另多少个便宜是布署留在调节之后它们相关的触发器已过期,所以它可在后来重新陈设的job,而毋庸再次定义它。它也得以让您无需重新定义其关系的job修改或沟通Tirgger。

 

JobDataMap

JobDataMap中可用于容纳任何数量的您希望提供给job实例在执行时(可序列化)的对象。JobDataMap实现了IDictionary接口,并为其添加了一些用于存储和检索基本类型的数据的实用方法。
 
下面是JobDataMap 快速上手代码,在添加job到scheduler之前先为JobDataMap添加一些数据 :

1 // define the job and tie it to our DumbJob class
2 IJobDetail job = JobBuilder.Create<DumbJob>()
3     .WithIdentity("myJob", "group1") // name "myJob", group "group1"
4     .UsingJobData("jobSays", "Hello World!")
5     .UsingJobData("myFloatValue", 3.141f)
6     .Build();

上面是从施行的job中得到JobDataMap 数据

 1 Getting Values from a JobDataMap
 2 public class DumbJob : IJob
 3 {
 4     public void Execute(JobExecutionContext context)
 5     {
 6       JobKey key = context.JobDetail.Key;
 7 
 8       JobDataMap dataMap = context.JobDetail.JobDataMap;
 9 
10       string jobSays = dataMap.GetString("jobSays");
11       float myFloatValue = dataMap.GetFloat("myFloatValue");
12 
13       Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   jobSays   ", and val is: "   myFloatValue);
14     }
15 }

假设你计划接纳两个滴水穿石的JobStore (JobStore 将要JobStore 部分进行商量)你应该关心将要JobDataMap放些什么。因为它会被系列化,所以更易于生出版本难点。在规范的本子中是安全的,除此而外,任哪个人都得以更动你的实体类。所以只好关怀包容性会被毁掉的图景。

 

从而您能够把AdoJobStore and JobDataMap 放进map中,仅包涵着原始函数与字符串数据,因而排除了连串化的各类难点。

 

是因为Quartz暗许JobFactory会再job实例化的时候去实例那多少个带有set属性的,所以当您加多富含set访问的质量的时候会在JobDataMap中创设对应的key将其保存。那样就无须开始展览展现区提示在execute方法措施中张开映射。

 

Trigger也有其皮之不存毛将焉附的JobDataMap。当你须要四个Trigger进行调解和重新scheduler 那是可怜管用的。各样Trigger是独自的,并且须要您独自输入配置音信。

 

JobDataMap 将JobExecutionContext 作为job实践时候的上下文。它里面包括了JobDataMap 和Trigger并且覆盖后面一样的值。

 

上边是来自JobExecutionContext获取数据的课业实施进程中群集的JobDataMap的叁个不难的事例:

澳门新萄京 4 1 public class DumbJob : IJob 2 { 3 public void Execute(IJobExecutionContext context) 4 { 5 JobKey key = context.JobDetail.Key; 6 7 JobDataMap dataMap = context.MergedJobDataMap; // Note the difference from the previous example 8 9 string jobSays = dataMap.GetString("jobSays"); 10 float myFloatValue = dataMap.GetFloat("myFloatValue"); 11 IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"]; 12 state.Add(DateTimeOffset.UtcNow); 13 14 Console.Error.WriteLine("Instance " key " of DumbJob says: " jobSays ", and val is: " myFloatValue); 15 } 16 }

View Code

照旧,要是你想依赖的JobFactory“注入”数据映射值到您的类,它恐怕看起来像那么些:

澳门新萄京 5 1 public class DumbJob : IJob 2 { 3 public string JobSays { private get; set; } 4 public float FloatValue { private get; set; } 5 6 public void Execute(IJobExecutionContext context) 7 { 8 JobKey key = context.JobDetail.Key; 9 10 JobDataMap dataMap = context.MergedJobDataMap; // Note the difference from the previous example 11 12 IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"]; 13 state.Add(DateTimeOffset.UtcNow); 14 15 Console.Error.WriteLine("Instance " key " of DumbJob says: " JobSays ", and val is: " FloatValue); 16 } 17 } View Code

你会小心到类的全部代码较长,但在execute()方法的代码是根本。人们还是能够争辨说,纵然代码越长,它实际上花了更加少的编码,若是技术员的IDE用于自动生成的品质,而毋庸手工业编写制定单独的调用从JobDataMap中检索值。那是你的挑选。

当您定义一个完成IJob接口的类的时候,你要求在内部落成实际供给实践的代码。Quartz.NET须求精晓关于那代码的各样新闻,这样 Quartz.NET技艺像您愿意的那样行事。这么些细节是在JobDetail类中张开了描述,在上1节以及开始展览了简易的讲述。

当您定义三个实现IJob接口的类的时候,你供给在里边实现实际必要进行的代码。Quartz.NET必要通晓关于那代码的各类新闻,那样 Quartz.NET技艺像您愿意的那么行事。那些细节是在JobDetail类中开始展览了描述,在上壹节以及开展了简要的讲述。

澳门新萄京 6// define the job and tie it to our HelloJob class
澳门新萄京 7JobDetail job = new JobDetail("job1", "group1", typeof(HelloJob));
澳门新萄京 8// Trigger the job to run on the next round minute
澳门新萄京 9SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1", runTime);
澳门新萄京 10            
澳门新萄京 11// Tell quartz to schedule the job using our trigger
澳门新萄京 12sched.ScheduleJob(job, trigger);
澳门新萄京 13

Identities

乔布斯和tirggers容许在登记到Quartz scheduler定义key。那一个key是很有用的在集团管制jobs和tirggers。对于组key同样的jobs和tiggers被含有在1个组里。

Job “Instances”

很多用户花费时间是困惑究竟是什么构成了“Job实例”。我们会尽力讲清楚这里,下面有关的工作状态和并发性的部分。
 
您可以创建一个job类,并通过创建JobDetails的多个实例的调度中存储了很多“实例定义” - 每一个都有自己的属性和JobDataMap - 并且他们都增加到scheduler中
 
例如,你可以创建一个实现所谓的“SalesReportJob”的IJob接口的类。这个job可能会被编码到期望发送给它(通过JobDataMap中)来指定销售报告应根据销售人员的姓名参数。然后它们可以创建多个定义的job(JobDetails),如“SalesReportForJoe”和“SalesReportForMike”具有“乔joe”和“Mike”在相应JobDataMaps作为输入到各自的job指定。
 
当Trigger启动,将一个JobDetail(实例定义),它会被自动加载,和job类是指通过对调度配置的JobFactory实例化。默认的JobFactory只是调用使用Activator.CreateInstance 调用job类的默认构造函数,然后尝试在匹配的JobDataMap中的键名该类调用setter属性。您可能希望创建自己的实现的JobFactory来完成的事情,如让你的应用程序的IoC或者DI容器产生/初始化作业实例。
 
In “Quartz speak”, 我们指的是每个存储的JobDetail作为“job定义”或“的JobDetail实例”,我们指的是每一个执行job作为“job实例”或“job定义实例”。通常,如果我们只是用这个词的“job”,我们指的是一个名为定义或JobDetail等。当我们指的是类实现job接口,我们平时使用的术语“job type”。

 

 

前几日考虑如下概念的SimpleJob类:

Job State and Concurrency

现在有一些关于Job的状态数据(aka JobDataMap)和并发性附加说明。可以天剑组合特性到你的job类上,来影响Quartz’的行为。
 
DisallowConcurrentExecution添加到Job类,告诉Quartz不执行给定的job定义的多个实例(即是指给定的job类)并发的属性。注意这里面的所说,必须小心使用。在上一节的例子中,如果“SalesReportJob”有这个属性,比只有一个“SalesReportForJoe”的实例可以在给定时间执行的,但它可以与“SalesReportForMike”的一个实例,同时执行。约束是基于一个实例定义(JobDetail等),而不是在工作类的实例。但是,它(quartz的设计),决定对类本身携带的属性,因为它决定对类进行怎样进行编译。
 
PersistJobDataAfterExecution是可以被添加到Job类,告诉quartz更新JobDetail的JobDataMap存储的副本属性在execute()方法成功完成后(未抛出异常),使得同样的job在下一次执行(JobDetail)接收,而不是原先存储的值的更新的值。像DisallowConcurrentExecution属性,这适用于作业定义实例,而不是一个作业类的实例,虽然当时决定让job类携带的属性,因为它往往使对类是如何编码的差异(如'有状态'将需要显式地“理解”的执行方法中的代码)。
 
如果使用PersistJobDataAfterExecution属性,你应该认真考虑也使用DisallowConcurrentExecution属性,以避免留下什么数据时,同样的job(JobDetail)的两个实例并发执行存储可能的混淆(竞争条件)

JobDetail由JobBuilder进行实例化的。JobBuilder容许开采人士使用 fluent interface.举行自定义JobDetail细节。

JobDetail由JobBuilder进行实例化的。JobBuilder容许开辟人士使用 fluent interface.进行自定义JobDetail细节。

澳门新萄京 14public class SimpleJob : IJob
澳门新萄京 15澳门新萄京 16澳门新萄京 17{
澳门新萄京 18        
澳门新萄京 19        private static ILog _log = LogManager.GetLogger(typeof(SimpleJob));
澳门新萄京 20        
澳门新萄京 21澳门新萄京 22        /**//// <summary> 
澳门新萄京 23        /// Empty constructor for job initilization.
澳门新萄京 24        /// </summary>
澳门新萄京 25        public SimpleJob()
澳门新萄京 26澳门新萄京 27        澳门新萄京 28{
澳门新萄京 29        }
澳门新萄京 30        
澳门新萄京 31澳门新萄京 32        /**//// <summary>
澳门新萄京 33        /// Called by the <see cref="IScheduler" /> when a
澳门新萄京 34        /// <see cref="Trigger" /> fires that is associated with
澳门新萄京 35        /// the <see cref="IJob" />.
澳门新萄京 36        /// </summary>
澳门新萄京 37        public virtual void  Execute(JobExecutionContext context)
澳门新萄京 38澳门新萄京 39        澳门新萄京 40{
澳门新萄京 41            // This job simply prints out its job name and the
澳门新萄京 42            // date and time that it is running
澳门新萄京 43            string jobName = context.JobDetail.FullName;
澳门新萄京 44            _log.Info(string.Format("SimpleJob says: {0} executing at {1}", jobName, DateTime.Now.ToString("r")));
澳门新萄京 45      }
澳门新萄京 46}
澳门新萄京 47

Other Attributes Of Jobs

下面是可用于通过JobDetail等对象的job实例来定义的其他属性的简单总结:
 
持久性 - 如果job是不可持久的,它会自动从调度中删除,一旦不再有与之相关的任何活动的触发器。换句话说,非持久job具有一个寿命由其触发的存在的限制。
可恢复性 - 如果作业“要求恢复”,它是在调度的“硬关闭”的时间执行(即它崩溃中运行的过程中,或在机器关闭),然后重新执行当调度程序重新开始。在这种情况下,JobExecutionContext.Recovering属性将返回真。

 

 

注意,大家给scheduler传入了2个JobDetail实例,而且以此JobDetail实例只是简短提供了类名来引用被试行的Job。每一回scheduler施行那一个职分时,它就创制那几个类的新实例,然后调用该实例的Execute(..)方法。对那种行为的2个推测就是Job类必须有1个无参数的构造函数。别的二个估计就是它使得Job类中定义的积极分子数量失去意义,因为这几个成员数据值在每一次实施的时候被“清空”了。

JobExecutionException

最后,我们需要告诉你的IJob.Execute(..)方法的一些细节。你应该从执行方法抛出的唯一类型是JobExecutionException。正因为如此,你通常应该换execute方法的全部内容以'的try-catch“块。你也应该花一些时间看的JobExecutionException的文档,你的工作可以用它来提供调度各种指令为你想怎么异常进行处理。

第1课 More About JobsJobDetails(官方文书档案翻译),quartzjobs 当学完第2课之后,你欢天喜地的意识,让jobs工作起来是依然万分轻易的。尽管让...

让大家花点时间看Job的建制以及在Quartz.NET中的生命周期。在率先节中1度看到的例证让大家再看二遍:

让大家花点时间看Job的编写制定以及在Quartz.NET中的生命周期。在率先节中1度见到的例子让我们再看壹遍:

你只怕要问,怎么样才干为每种Job实例提供属性和布局呢?而且,在实施中怎么着追踪Job的情事吧?这几个主题材料的答案是同样的:关键正是JobDataMap,那是JobDetail对象的一片段。

澳门新萄京 48澳门新萄京 49

澳门新萄京 50澳门新萄京 51

JobDataMap

 1 // define the job and tie it to our HelloJob class
 2 IJobDetail job = JobBuilder.Create<HelloJob>()
 3     .WithIdentity("myJob", "group1")
 4     .Build();
 5 
 6 // Trigger the job to run now, and then every 40 seconds
 7 ITrigger trigger = TriggerBuilder.Create()
 8   .WithIdentity("myTrigger", "group1")
 9   .StartNow()
10   .WithSimpleSchedule(x => x
11       .WithIntervalInSeconds(40)
12       .RepeatForever())
13   .Build();
14   
15 sched.ScheduleJob(job, trigger);
 1 // define the job and tie it to our HelloJob class
 2 IJobDetail job = JobBuilder.Create<HelloJob>()
 3     .WithIdentity("myJob", "group1")
 4     .Build();
 5 
 6 // Trigger the job to run now, and then every 40 seconds
 7 ITrigger trigger = TriggerBuilder.Create()
 8   .WithIdentity("myTrigger", "group1")
 9   .StartNow()
10   .WithSimpleSchedule(x => x
11       .WithIntervalInSeconds(40)
12       .RepeatForever())
13   .Build();
14   
15 sched.ScheduleJob(job, trigger);

JobDataMap被用来保存一文山会海的(系列化的)对象,那几个目的在Job实践时方可博得。JobDataMap是IDictionary接口的3个达成,而且还扩张了有些积攒和读取主类型数据的方便人民群众情势。

View Code

View Code

上边是将Job到场到scheduler前应用的某些向JobDataMap参加数据的点子。

今昔定义三个HelloJob 如下所示:

当今概念一个HelloJob 如下所示:

澳门新萄京 52// pass initialization parameters into the job
澳门新萄京 53job1.JobDataMap.Put(ColorJob.FAVORITE_COLOR, "Green");
澳门新萄京 54job1.JobDataMap.Put(ColorJob.EXECUTION_COUNT, 1);
澳门新萄京 55

1 public class HelloJob : IJob
2 {
3     public void Execute(IJobExecutionContext context)
4     {
5         Console.WriteLine("HelloJob is executing.");
6     }
7 }
1 public class HelloJob : IJob
2 {
3     public void Execute(IJobExecutionContext context)
4     {
5         Console.WriteLine("HelloJob is executing.");
6     }
7 }

上面包车型地铁代码体现了在Job施行进度中从JobDataMap 获取数据的代码:

请小心,在此间给scheduler 二个IJobDetail 实例,它只须求2个job实例就会拓展运作。当scheduler实施job的时候,scheduler 会在调用Execute方法在此以前实例化1个job实例。 能实例化job的前提是job类中需求有个无参的构造函数。还有叁个亟需小心的是,在job类中定义任何数据字段其实未有何太大的意思,因为在job的运转时期不会保留这一个数据字段。

请留意,在此地给scheduler 3个IJobDetail 实例,它只须求二个job实例就能够打开运作。当scheduler实践job的时候,scheduler 会在调用Execute方法在此之前实例化二个job实例。 能实例化job的前提是job类中必要有个无参的构造函数。还有2个内需留意的是,在job类中定义任何数据字段其实没有怎么太大的意思,因为在job的周转时期不会保留这一个数据字段。

澳门新萄京 56澳门新萄京 57/**//// <summary>
澳门新萄京 58    /// This is just a simple job that receives parameters and
澳门新萄京 59    /// maintains state
澳门新萄京 60    /// </summary>
澳门新萄京 61    /// <author>Bill Kratzer</author>
澳门新萄京 62    public class ColorJob : IStatefulJob
澳门新萄京 63澳门新萄京 64    澳门新萄京 65{
澳门新萄京 66        
澳门新萄京 67        private static ILog _log = LogManager.GetLogger(typeof(ColorJob));
澳门新萄京 68        
澳门新萄京 69        // parameter names specific to this job
澳门新萄京 70        public const string FAVORITE_COLOR = "favorite color";
澳门新萄京 71        public const string EXECUTION_COUNT = "count";
澳门新萄京 72        
澳门新萄京 73        // Since Quartz will re-instantiate a class every time it
澳门新萄京 74        // gets executed, members non-static member variables can
澳门新萄京 75        // not be used to maintain state!
澳门新萄京 76        private int _counter = 1;
澳门新萄京 77        
澳门新萄京 78    
澳门新萄京 79澳门新萄京 80        /**//// <summary>
澳门新萄京 81        /// Called by the <see cref="IScheduler" /> when a
澳门新萄京 82        /// <see cref="Trigger" /> fires that is associated with
澳门新萄京 83        /// the <see cref="IJob" />.
澳门新萄京 84        /// </summary>
澳门新萄京 85        public virtual void Execute(JobExecutionContext context)
澳门新萄京 86澳门新萄京 87        澳门新萄京 88{
澳门新萄京 89            
澳门新萄京 90            // This job simply prints out its job name and the
澳门新萄京 91            // date and time that it is running
澳门新萄京 92            string jobName = context.JobDetail.FullName;
澳门新萄京 93            
澳门新萄京 94            // Grab and print passed parameters
澳门新萄京 95            JobDataMap data = context.JobDetail.JobDataMap;
澳门新萄京 96            string favoriteColor = data.GetString(FAVORITE_COLOR);
澳门新萄京 97            int count = data.GetInt(EXECUTION_COUNT);
澳门新萄京 98            _log.Info(string.Format("ColorJob: {0} executing at {1}n  favorite color is {2}n  execution count (from job map) is {3}n  execution count (from job member variable) is {4}", 
澳门新萄京 99                jobName, DateTime.Now.ToString("r"), favoriteColor, count, _counter));
澳门新萄京 100澳门新萄京官方文档翻译,更多关于Jobs和JobDetails。            
澳门新萄京 101            // increment the count and store it back into the 
澳门新萄京 102            // job map so that job state can be properly maintained
澳门新萄京 103            count ;
澳门新萄京 104            data.Put(EXECUTION_COUNT, count);
澳门新萄京 105            
澳门新萄京 106            // Increment the local member variable 
澳门新萄京 107            // This serves no real purpose since job state can not 
澳门新萄京 108            // be maintained via member variables!
澳门新萄京 109            _counter ;
澳门新萄京 110        }
澳门新萄京 111
澳门新萄京 112    } 
澳门新萄京 113

 

 

假设运用多个坚韧不拔的JobStore(在本指南的JobStore章节中切磋),那么必须注意存放在JobDataMap中的内容。因为放入JobDataMap中的内容将被连串化,而且轻便出现类型调换难点。很显然,标准.NET类型将是万分安全的,但除了的门类,任曾几何时候,只要有人改换了你要体系化其实例的类的概念,将要注意是或不是打破了程序的包容性。别的,你能够对JobStore和JobDataMap选择一种选取格局:正是只把主类型和String类型存放在Map中,那样就足以减小前边类别化的主题素材。

探望那你恐怕会问,那本身何感到一个job提供属性和布置新闻呢?并且这么能追踪保持job的实市价况吧?要应对那些题目,关键要弄懂JobDataMap,它是JobDetail中的一部分。

看样子这你大概会问,这小编如何为一个job提供属性和安顿音信吗?并且这么能追踪保持job的履市场价格况吧?要应对这几个标题,关键要弄懂JobDataMap,它是JobDetail中的一片段。

有事态和无状态职分

 

 

Triggers也足以有JobDataMaps与之相关联。当scheduler中的Job被八个有规律可能重新触发的Triggers所选择时越发有效。对于每回独立的触发,你可为Job提供分化的输入数据。

JobDataMap

style="font-family: 'Microsoft YaHei'; font-size: 16px;">JobDataMap中可用以容纳任何数据的你希望提必要job实例在实施时(可连串化)的对象。JobDataMap达成了IDictionary接口,并为其加多了有个别用来存款和储蓄和探求基本项目的数指标实用方法。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面是JobDataMap 快捷上手代码,在增添job到scheduler此前先为JobDataMap增多一些数据 :

1 // define the job and tie it to our DumbJob class
2 IJobDetail job = JobBuilder.Create<DumbJob>()
3     .WithIdentity("myJob", "group1") // name "myJob", group "group1"
4     .UsingJobData("jobSays", "Hello World!")
5     .UsingJobData("myFloatValue", 3.141f)
6     .Build();

style="font-family: 'Microsoft YaHei'; font-size: 16px;">上面是从实施的job中获得JobDataMap 数据

 1 Getting Values from a JobDataMap
 2 public class DumbJob : IJob
 3 {
 4     public void Execute(JobExecutionContext context)
 5     {
 6       JobKey key = context.JobDetail.Key;
 7 
 8       JobDataMap dataMap = context.JobDetail.JobDataMap;
 9 
10       string jobSays = dataMap.GetString("jobSays");
11       float myFloatValue = dataMap.GetFloat("myFloatValue");
12 
13       Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   jobSays   ", and val is: "   myFloatValue);
14     }
15 }

style="font-family: 'Microsoft YaHei'; font-size: 1陆px;">假诺你策画利用2个持久的JobStore (JobStore 就要JobStore 部分实行研讨)你应有关爱将要JobDataMap放些什么。因为它会被系列化,所以更易于产生版本难题。在专门的工作的本子中是高枕而卧的,除却,任什么人都足以改造你的实体类。所以只可以关注包容性会被损坏的意况。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 1六px;">所以你可以把AdoJobStore and JobDataMap 放进map中,仅蕴含着原始函数与字符串数据,因而解除了连串化的种种难点。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 1陆px;">由于Quartz暗中同意JobFactory会再job实例化的时候去实例那么些富含set属性的,所以当您加多富含set访问的本性的时候会在JobDataMap中成立对应的key将其保存。那样就绝不实行突显区提醒在execute方法措施中实行映射。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">Trigger也有其连带的JobDataMap。当您须求五个Trigger实行调整和另行scheduler 那是尤其有效的。各个Trigger是单身的,并且须求你独自输入配置音信。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 1陆px;">JobDataMap 将JobExecutionContext 作为job实行时候的上下文。它里面包括了JobDataMap 和Trigger并且覆盖前面一样的值。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">上面是来源于JobExecutionContext获取数据的功课实行进度中集结的JobDataMap的三个粗略的事例:

澳门新萄京 114澳门新萄京 115

 1 public class DumbJob : IJob
 2 {
 3     public void Execute(IJobExecutionContext context)
 4     {
 5         JobKey key = context.JobDetail.Key;
 6 
 7         JobDataMap dataMap = context.MergedJobDataMap;  // Note the difference from the previous example
 8 
 9         string jobSays = dataMap.GetString("jobSays");
10         float myFloatValue = dataMap.GetFloat("myFloatValue");
11         IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"];
12         state.Add(DateTimeOffset.UtcNow);
13 
14         Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   jobSays   ", and val is: "   myFloatValue);
15     }
16 }

View Code

style="font-family: 'Microsoft YaHei'; font-size: 16px;">依然,假使您想借助的JobFactory“注入”数据映射值到您的类,它可能看起来像那几个:

澳门新萄京 116澳门新萄京 117

 1 public class DumbJob : IJob
 2 {
 3     public string JobSays { private get; set; }
 4     public float FloatValue { private get; set; }
 5       
 6     public void Execute(IJobExecutionContext context)
 7     {
 8         JobKey key = context.JobDetail.Key;
 9 
10         JobDataMap dataMap = context.MergedJobDataMap;  // Note the difference from the previous example
11 
12         IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"];
13         state.Add(DateTimeOffset.UtcNow);
14 
15         Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   JobSays   ", and val is: "   FloatValue);
16     }
17 }

View Code

style="font-family: 'Microsoft YaHei'; font-size: 16px;">您会小心到类的整整代码较长,但在execute()方法的代码是根本。人们还足以争辨说,尽管代码越长,它实质上花了更加少的编码,假设程序猿的IDE用于自动生成的质量,而没有须求手工业编写制定单独的调用从JobDataMap中检索值。那是你的抉择。

JobDataMap

style="font-family: 'Microsoft YaHei'; font-size: 16px;">JobDataMap中可用于容纳任何数据的你希望提须要job实例在实践时(可序列化)的目标。JobDataMap达成了IDictionary接口,并为其加多了1部分用以存款和储蓄和查找基本项目的数据的实用方法。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面是JobDataMap 快速上手代码,在加多job到scheduler在此之前先为JobDataMap加多一些数据 :

1 // define the job and tie it to our DumbJob class
2 IJobDetail job = JobBuilder.Create<DumbJob>()
3     .WithIdentity("myJob", "group1") // name "myJob", group "group1"
4     .UsingJobData("jobSays", "Hello World!")
5     .UsingJobData("myFloatValue", 3.141f)
6     .Build();

style="font-family: 'Microsoft YaHei'; font-size: 16px;">上面是从施行的job中获得JobDataMap 数据

 1 Getting Values from a JobDataMap
 2 public class DumbJob : IJob
 3 {
 4     public void Execute(JobExecutionContext context)
 5     {
 6       JobKey key = context.JobDetail.Key;
 7 
 8       JobDataMap dataMap = context.JobDetail.JobDataMap;
 9 
10       string jobSays = dataMap.GetString("jobSays");
11       float myFloatValue = dataMap.GetFloat("myFloatValue");
12 
13       Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   jobSays   ", and val is: "   myFloatValue);
14     }
15 }

style="font-family: 'Microsoft YaHei'; font-size: 16px;">固然您筹算接纳贰个锲而不舍的JobStore (JobStore 将在JobStore 部分举办斟酌)你应当关切就要JobDataMap放些什么。因为它会被系列化,所以更易于生出版本难点。在规范的本子中是安全的,除此而外,任何人都得以转移你的实体类。所以不得不关心包容性会被磨损的状态。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 1陆px;">所以你能够把AdoJobStore and JobDataMap 放进map中,仅包涵着原始函数与字符串数据,由此排除了体系化的各类难点。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">由于Quartz私下认可JobFactory会再job实例化的时候去实例那多少个饱含set属性的,所以当你增加富含set访问的性质的时候会在JobDataMap中制造对应的key将其保存。那样就无须实行显示区提示在execute方法情势中张开映射。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">Trigger也有其有关的JobDataMap。当您需求八个Trigger进行调节和重复scheduler 那是丰富实用的。每一种Trigger是独立的,并且须要您独自输入配置音讯。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 1陆px;">JobDataMap 将JobExecutionContext 作为job试行时候的上下文。它个中富含了JobDataMap 和Trigger并且覆盖前边同样的值。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下边是发源JobExecutionContext获取数据的课业实施进程中联合的JobDataMap的3个简练的例证:

澳门新萄京 118澳门新萄京 119

 1 public class DumbJob : IJob
 2 {
 3     public void Execute(IJobExecutionContext context)
 4     {
 5         JobKey key = context.JobDetail.Key;
 6 
 7         JobDataMap dataMap = context.MergedJobDataMap;  // Note the difference from the previous example
 8 
 9         string jobSays = dataMap.GetString("jobSays");
10         float myFloatValue = dataMap.GetFloat("myFloatValue");
11         IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"];
12         state.Add(DateTimeOffset.UtcNow);
13 
14         Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   jobSays   ", and val is: "   myFloatValue);
15     }
16 }

View Code

style="font-family: 'Microsoft YaHei'; font-size: 16px;">抑或,如果你想依赖的JobFactory“注入”数据映射值到您的类,它或许看起来像那一个:

澳门新萄京 120澳门新萄京 121

 1 public class DumbJob : IJob
 2 {
 3     public string JobSays { private get; set; }
 4     public float FloatValue { private get; set; }
 5       
 6     public void Execute(IJobExecutionContext context)
 7     {
 8         JobKey key = context.JobDetail.Key;
 9 
10         JobDataMap dataMap = context.MergedJobDataMap;  // Note the difference from the previous example
11 
12         IList<DateTimeOffset> state = (IList<DateTimeOffset>) dataMap["myStateData"];
13         state.Add(DateTimeOffset.UtcNow);
14 
15         Console.Error.WriteLine("Instance "   key   " of DumbJob says: "   JobSays   ", and val is: "   FloatValue);
16     }
17 }

View Code

style="font-family: 'Microsoft YaHei'; font-size: 16px;">你会注意到类的上上下下代码较长,但在execute()方法的代码是根本。人们还是能够争持说,就算代码越长,它实际上花了越来越少的编码,假设程序猿的IDE用于自动生成的性格,而不要手工业编写制定单独的调用从JobDataMap中检索值。这是你的挑三拣4。

从Job实行时的JobExecutionContext中获得JobDataMap是惯用手段,它融合了从JobDetail和从Trigger中获的JobDataMap,当有一致名字的键时,它用后世的值覆盖前者值。

Job “Instances”

style="font-family: 'Microsoft YaHei'; font-size: 16px;">无数用户消费时间是纳闷究竟是怎么构成了“Job实例”。大家会一心一意讲通晓这里,上边关于的办事景况和并发性的一部分。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">你能够创立二个job类,并经过创办JobDetails的三个实例的调解中存款和储蓄了许多“实例定义” - 每三个都有谈得来的天性和JobDataMap - 还要她们都增添到scheduler中

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">比方,你能够创制二个兑现所谓的“SalesReportJob”的IJob接口的类。那一个job也许会被编码到梦想发送给它(通过JobDataMap中)来内定出卖报告应依附贩卖人士的全名参数。然后它们得以创建多少个概念的job(JobDetails),如“SalesReportForJoe”和“SalesReportFor迈克”具备“乔joe”和“迈克”在对应JobDataMaps作为输入到个别的job内定。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">当Trigger运转,将多个JobDetail(实例定义),它会被机关加载,和job类是指通过对调度安排的JobFactory实例化。私下认可的JobFactory只是调用使用Activator.CreateInstance 调用job类的默许构造函数,然后尝试在合营的JobDataMap中的键名该类调用setter属性。您恐怕希望创立谐和的贯彻的JobFactory来成功的职业,如让您的应用程序的IoC只怕DI容器发生/开头化作业实例。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

In “Quartz speak”, 大家指的是各种存款和储蓄的JobDetail作为“job定义”或“的JobDetail实例”,大家指的是每2个执行job作为“job实例”或“job定义实例”。经常,假诺我们只是用那个词的“job”,我们指的是贰个名叫定义或JobDetail等。当大家指的是类实现job接口,大家常常使用的术语“job type”。

Job “Instances”

style="font-family: 'Microsoft YaHei'; font-size: 16px;">重重用户消费时间是疑心毕竟是怎么着构成了“Job实例”。我们会全神贯注讲精晓这里,下边关于的做事意况和并发性的部分。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">您能够成立2个job类,并通过成立JobDetails的多少个实例的调节中贮存了多数“实例定义” - 每二个都有投机的习性和JobDataMap - 同时他们都增加到scheduler中

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">譬如说,你能够创立三个达成所谓的“SalesReportJob”的IJob接口的类。这一个job恐怕会被编码到希望发送给它(通过JobDataMap中)来内定出售报告应依据出售职员的姓名参数。然后它们能够创设多少个概念的job(JobDetails),如“SalesReportForJoe”和“SalesReportFor迈克”具有“乔joe”和“迈克”在相应JobDataMaps作为输入到各自的job钦赐。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">当Trigger运营,将2个JobDetail(实例定义),它会被电动加载,和job类是指通过对调治布署的JobFactory实例化。默许的JobFactory只是调用使用Activator.CreateInstance 调用job类的暗许构造函数,然后尝试在杰出的JobDataMap中的键名该类调用setter属性。您或然希望创立自个儿的兑现的JobFactory来落成的事务,如让你的应用程序的IoC只怕DI容器发生/开首化作业实例。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

In “Quartz speak”, 大家指的是每一种存款和储蓄的JobDetail作为“job定义”或“的JobDetail实例”,大家指的是每四个实践job作为“job实例”或“job定义实例”。平日,如若大家只是用那几个词的“job”,大家指的是1个名称为定义或JobDetail等。当大家指的是类达成job接口,大家一向接纳的术语“job type”。

StatefulJob——有状态义务

Job State and Concurrency

style="font-family: 'Microsoft YaHei'; font-size: 16px;">于今有局地关于Job的动静数据(aka JobDataMap)和并发性附加表明。能够天剑组合个性到你的job类上,来影响Quartz’的表现。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">DisallowConcurrentExecution增添到Job类,告诉Quartz不实行给定的job定义的三个实例(正是指给定的job类)并发的属性。注意这其中的所说,必须小心使用。在上1节的例子中,纵然“SalesReportJob”有那些脾性,比唯有三个“SalesReportForJoe”的实例能够在给定时期实行的,但它能够与“SalesReportFor迈克”的三个实例,同时试行。约束是基于3个实例定义(JobDetail等),而不是在事业类的实例。不过,它(quartz的绸缪),决定对类自己指引的习性,因为它决定对类进行哪些实行编写翻译。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">PersistJobDataAfterExecution是足以被增多到Job类,告诉quartz更新JobDetail的JobDataMap存款和储蓄的别本属性在execute()方法成功做到后(未抛出越发),使得同一的job在下一次推行(JobDetail)接收,而不是原先存款和储蓄的值的更新的值。像DisallowConcurrentExecution属性,那适用于作业定义实例,而不是二个作业类的实例,纵然当时决定让job类引导的属性,因为它往往使对类是何许编码的歧异(如'有意况'将必要显式地“精通”的实行办法中的代码)。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">借使选拔PersistJobDataAfterExecution属性,你应该认真想念也运用DisallowConcurrentExecution属性,以幸免留下如何数据时,同样的job(JobDetail)的多个实例并发推行存款和储蓄恐怕的混淆(竞争规则)

Job State and Concurrency

style="font-family: 'Microsoft YaHei'; font-size: 16px;">方今有1对关于Job的意况数据(aka JobDataMap)和并发性附加表明。能够天剑组合天性到你的job类上,来震慑Quartz’的作为。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">DisallowConcurrentExecution增添到Job类,告诉Quartz不试行给定的job定义的四个实例(就是指给定的job类)并发的性质。注意那之中的所说,必须小心使用。在上1节的事例中,假设“SalesReportJob”有这些特性,比唯有3个“SalesReportForJoe”的实例能够在加以时间试行的,但它能够与“SalesReportForMike”的一个实例,同时试行。约束是依赖2个实例定义(JobDetail等),而不是在职业类的实例。但是,它(quartz的设计),决定对类本身带领的属性,因为它决定对类举行什么样举办编写翻译。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">PersistJobDataAfterExecution是能够被加多到Job类,告诉quartz更新JobDetail的JobDataMap存款和储蓄的别本属性在execute()方法成功完结后(未抛出特别),使得同样的job在下3遍试行(JobDetail)接收,而不是本来存储的值的更新的值。像DisallowConcurrentExecution属性,那适用于作业定义实例,而不是二个作业类的实例,就算当时决定让job类引导的性质,因为它往往使对类是何等编码的差距(如'有情形'将须求显式地“明白”的执行措施中的代码)。

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

lang="EN-US">即便应用PersistJobDataAfterExecution属性,你应当认真惦念也利用DisallowConcurrentExecution属性,以幸免留下什么数据时,同样的job(JobDetail)的多个实例并发施行存款和储蓄恐怕的模糊(竞争原则)

近来,一些关于Job状态数据的增大论题:贰个Job实例能够被定义为“有状态的”或然“无状态的”。“无状态的”职责只具有它们被投入到scheduler时所蕴藏的JobDataMap。那意味,在实行职责进度中其他对Job Data Map所作的转移都将遗失而且职责下次进行时也无能为力看到。你大概会猜忌出,有状态的职务恰好相反,它在任务的每趟推行之后再也存款和储蓄JobDataMap。有气象义务的二个副成效就是它不能够并发实行。换句话说,固然任务有意况,那么当触发器在那个任务现已在奉行的时候试图触发它,这些触发器就能够被打断(等待),直到前边的举行到位。

Other Attributes Of Jobs

style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面是可用于经过JobDetail等对象的job实例来定义的其它质量的总结总括:

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">持久性


1经job是不可持久的,它会活动从调治中去除,壹旦不再有与之有关的任何活动的触发器。换句话说,非持久job具备三个寿命由其触发的存在的界定。

style="font-family: 'Microsoft YaHei'; font-size: 16px;">可苏醒性


假诺作业“要求苏醒”,它是在调解的“硬关闭”的时光施行(即它崩溃中运作的历程中,或在机械关闭),然后再一次试行业调节程序重新开头。在那种景观下,JobExecutionContext.Recovering属性将回到真。

Other Attributes Of Jobs

style="font-family: 'Microsoft YaHei'; font-size: 16px;">上边是可用于经过JobDetail等目的的job实例来定义的其余属性的轻易计算:

style="font-family: 'Microsoft YaHei'; font-size: 16px;"> 

style="font-family: 'Microsoft YaHei'; font-size: 16px;">持久性


设若job是不足持久的,它会自行从调整中删除,一旦不再有与之有关的此外活动的触发器。换句话说,非持久job具备1个寿命由其触发的留存的限定。

style="font-family: 'Microsoft YaHei'; font-size: 16px;">可复苏性


万1作业“必要恢复”,它是在调解的“硬关闭”的年华实践(即它崩溃中运作的进程中,或在机器关闭),然后重新试行业调节程序重新早先。在这种场地下,JobExecutionContext.Recovering属性将赶回真。

想使职务有事态,它就要贯彻IStatefulJob接口而不是贯彻IJob接口。

JobExecutionException

style="font-family: 'Microsoft YaHei'; font-size: 16px;">最后,大家需求告诉你的IJob.Execute(..)方法的有个别细节。你应该从实践措施抛出的唯1项目是JobExecutionException。正因为如此,你司空见惯应该换execute方法的全体内容以'的try-catch“块。你也理应花一些时刻看的JobExecutionException的文书档案,你的做事得以用它来提供调治各样指令为你想怎么非凡进行管理。

JobExecutionException

style="font-family: 'Microsoft YaHei'; font-size: 16px;">最终,大家供给告诉你的IJob.Execute(..)方法的一对细节。你应有从施行格局抛出的唯1项目是JobExecutionException。正因为那样,你平时应该换execute方法的全体内容以'的try-catch“块。你也应当花一些时光看的JobExecutionException的文书档案,你的办事得以用它来提供调解各类吩咐为你想怎么卓殊实行拍卖。

Job 'Instances' 任务“实例”

以此科目标结尾观点可能早已很肯定,能够创造八个独自的Job类,并且通过成立五个JobDetails实例来将它的三个实例存款和储蓄在scheduler中,那样各样JobDetails对象都有它和煦的一套属性和JobDataMap,而且将它们都进入到scheduler中。

当触发器被触发的时候,通过Scheduler中布局的JobFactory来实例化与之提到的Job类。缺省的JobFactory只是简单地对Job类调用GetScheduler ()方法。创建自身JobFactory能够采取应用中诸如Ioc或许DI容器所产生恐怕发轫化的Job实例。

obs的别样属性

此间简短地计算一下经过JobDetail对象能够定义Job的其他性质。

  • Durability(持久性)-如若一个Job是不持久的, 1旦未有触发器与之提到,它就能被从scheduler 中自行删除。

  • Volatility(无常性)-假如三个Job是阪上走丸的,在再一次起动Quartz i scheduler 时它无法被保证。

 

  • RequestsRecovery(请求苏醒技能) -借使三个Job具有“请求苏醒”本领,当它在实行时遇到scheduler “硬性的闭馆”(举例:实践的经过崩溃,大概Computer被关机),那么当scheduler重新运营时,那几个任务会被另行施行。那种意况下,JobExecutionContext.Recovering 属性将是true。

  • JobListeners(职责监听器) -3个Job借使有0个恐怕多少个JobListeners监听器与之相关联,当这一个Job试行时,监听器被会被文告。越多关于JobListeners的研商见TriggerListeners & JobListeners章节。

 

JobExecutionException任务推行卓殊

最后,须求告诉你有个别有关Job.Execute(..)方法的底细。在Execute方法被施行时,仅允许抛出叁个JobExecutionException类型极度。因而供给将整个要实行的内容包蕴在2个'try-catch'块中。应开支一些时刻精心翻阅JobExecutionException文书档案,因为Job能够选择它向scheduler提供种种指令,你也得以精晓怎么管理格外。

本文由澳门新萄京发布于www.澳门新萄京赌场,转载请注明出处:澳门新萄京官方文档翻译,更多关于Jobs和JobDet

上一篇:澳门新萄京:基础操作符,基本运算符 下一篇:没有了
猜你喜欢
热门排行
精彩图文