法定文书档案翻译,net官方开发指南

By admin in 4858.com on 2019年4月13日

当学完第一课之后,你兴奋的发现,让jobs工作起来是依旧一对一简单的。即使让jobs运营起来很简单,对于其推行的重中之重内容照旧须要精晓的。它们是IJob接口中的Execute和JobDetails。

当学完第三课之后,你喜欢的觉察,让jobs工作起来是依旧一定简单的。尽管让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的生命周期是从它创造起来通过法定文书档案翻译,net官方开发指南。SchedulerFactory 到调用 Shutdown()后告竣。1旦Scheduler被创设,就能够调用add和remove方法来增加和移除Jobs和Triggers以及别的调度相关的操作(例如暂停trigger)。假若未有调用 Start()方法,Scheduler并不会在别的triggers 下实行此外jobs。

 

Quartz定义一种本人的特定语言格式(称为DSL或然是fluent
interface)在上一节中一度看见这样使用它的例证,让大家再看二回。

4858.com 14858.com 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脚下是玖:43:二7)

 

 

在所落成的类成为真正的“Job”时,期望职分所兼有的各样品质供给布告给Quartz。通过JobDetail类能够完结那几个工作,那一个类在日前的章节中曾简要聊到过。今后,大家花一些日子来研究Quartz中Jobs的本色和Job实例的生命周期。首先让大家纪念一下首先课中所看到的代码片断:

Jobs and Triggers

Job完结IJob 接口,接口里面仅有叁个简单的不二等秘书诀

IJob Interface

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

当trigger 触发时,scheduler’的线程调用Execute()方法。 JobExecutionContext 对象提供了Job实例以及运转时的环境消息由Scheduler 去执行,一个Trigger 被触发对于这次执行还带有JobDetail
对象以及其余项。

当scheduler添加1个Job的时候,scheduler会创设JobDetail 对象。它包蕴了Job的各样质量设置,作为一个JobDataMap保存,它能够用来存款和储蓄状态音讯为Job实例。它实质上是学业job的概念。细节在下一节课进行了研究。

接触对象用于触发Job的执行。当你希望执行3个job,你实例化三个trigger 和’调’其品质为你希望调度。触发器也恐怕有三个与之毛将焉附毛将安附的JobDataMap的

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

SimpleTrigger是最便利的,如果您须求’三次性’执行(在加以时刻的job只是单纯的实施),或许只要您必要在给定时间工作,并将其再一次N次,延迟T执行之间。假诺您愿意基于日历般的时间触发CronTrigger是有效的

  • “每月7日10:15”,“种种周天,深夜”。

为啥要有jobs和Triggers呢?许多 job schedulers并不曾 jobs and
triggers概念。壹些定义“job”作为不难地用一些小job标识符沿执行时间(或安插)。其余人则很像Quartz’s
job and
trigger 对象集合。在付出Quartz,大家觉得那是有意义的创导要在那一个时间表执行的时间表和行事中间的分手。那样做(在我们看来)很多便宜。

例如,Jobs能够被创制并能独立存储在 job
scheduler,并且许多triggers 能够用同1的job相关联。那种松耦合的另二个便宜是安插留在调度之后它们相关的触发器已过期,所以它可在随后重新安顿的job,而毋庸再次定义它。它也能够让你无需再一次定义其涉嫌的job修改或调换Tirgger。

 

当您定义3个贯彻IJob接口的类的时候,你供给在中间落成实际需求实行的代码。Quartz.NET需求了然关于那代码的种种消息,那样 Quartz.NET才能像您期望的那样行事。那一个细节是在JobDetail类中开始展览了描述,在上1节以及开始展览了简短的叙述。

当你定义3个落实IJob接口的类的时候,你须求在在那之中实现实际须求实施的代码。Quartz.NET须求驾驭有关这代码的种种消息,那样 Quartz.NET才能像你指望的那样行事。那几个细节是在JobDetail类中开始展览了描述,在上一节以及实行了回顾的叙说。

4858.com 3// define the job and tie it to our HelloJob class
4858.com 4JobDetail job = new JobDetail(“job1”, “group1”, typeof(HelloJob));
4858.com 5// Trigger the job to run on the next round minute
4858.com 6SimpleTrigger trigger = new SimpleTrigger(“trigger1”, “group1”, runTime);
4858.com 7            
4858.com 8// Tell quartz to schedule the job using our trigger
4858.com 9sched.ScheduleJob(job, trigger);
4858.com 10

Identities

Jobs和tirggers容许在登记到Quartz
scheduler定义key。那几个key是很有用的在公司管制jobs和tirggers。对于组key相同的jobs和tiggers被含有在多少个组里。

 

 

现行反革命设想如下概念的SimpleJob类:

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

JobDetail由JobBuilder举行实例化的。JobBuilder容许开发职员使用 fluent
interface.实行自定义JobDetail细节。

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

 

 

瞩目,大家给scheduler传入了2个JobDetail实例,而且这些JobDetail实例只是简单提供了类名来引用被实践的Job。每一次scheduler执行那个任务时,它就创办那么些类的新实例,然后调用该实例的Execute(..)方法。对那种表现的四个测算正是Job类必须有贰个无参数的构造函数。其余八个推测就是它使得Job类中定义的分子数量失去意义,因为那个分子数据值在每一遍执行的时候被“清空”了。

让我们花点时间看Job的体制以及在Quartz.NET中的生命周期。在率先节中早就见到的例子让大家再看二次:

让我们花点时间看Job的编制以及在Quartz.NET中的生命周期。在首先节中一度见到的例子让我们再看1回:

你只怕要问,如何才能为每一个Job实例提供属性和安顿呢?而且,在履行中怎么着跟踪Job的情事吧?这个题材的答案是1律的:关键正是JobDataMap,那是JobDetail对象的一片段。

4858.com 454858.com 46

4858.com 474858.com 48

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参加数据的措施。

现行反革命概念3个HelloJob 如下所示:

近年来定义三个HelloJob 如下所示:

4858.com 49// pass initialization parameters into the job
4858.com 50job1.JobDataMap.Put(ColorJob.FAVORITE_COLOR, “Green”);
4858.com 51job1.JobDataMap.Put(ColorJob.EXECUTION_COUNT, 1);
4858.com 52

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 实例,它只必要三个job实例就能展开运作。当scheduler执行job的时候,scheduler 会在调用Execute方法在此以前实例化三个job实例。 能实例化job的前提是job类中必要有个无参的构造函数。还有三个内需留意的是,在job类中定义任何数据字段其实未有怎么太大的意思,因为在job的周转时期不会保留那些数据字段。

请留意,在那边给scheduler 1个IJobDetail 实例,它只要求一个job实例就能开展运作。当scheduler执行job的时候,scheduler 会在调用Execute方法此前实例化二个job实例。 能实例化job的前提是job类中须求有个无参的构造函数。还有三个亟需留意的是,在job类中定义任何数据字段其实并未什么太大的意思,因为在job的周转时期不会保留那个数量字段。

4858.com 534858.com 54/**//// <summary>
4858.com 55    /// This is just a simple job that receives parameters and
4858.com 56    /// maintains state
4858.com 57    /// </summary>
4858.com 58    /// <author>Bill Kratzer</author>
4858.com 59    public class ColorJob : IStatefulJob
4858.com 604858.com 61    4858.com 62{
4858.com 63        
4858.com 64        private static ILog _log = LogManager.GetLogger(typeof(ColorJob));
4858.com 65        
4858.com 66        // parameter names specific to this job
4858.com 67        public const string FAVORITE_COLOR = “favorite color”;
4858.com 68        public const string EXECUTION_COUNT = “count”;
4858.com 69        
4858.com 70        // Since Quartz will re-instantiate a class every time it
4858.com 71        // gets executed, members non-static member variables can
4858.com 724858.com ,        // not be used to maintain state!
4858.com 73        private int _counter = 1;
4858.com 74        
4858.com 75    
4858.com 764858.com 77        /**//// <summary>
4858.com 78        /// Called by the <see cref=”IScheduler” /> when a
4858.com 79        /// <see cref=”Trigger” /> fires that is associated with
4858.com 80        /// the <see cref=”IJob” />.
4858.com 81        /// </summary>
4858.com 82        public virtual void Execute(JobExecutionContext context)
4858.com 834858.com 84        4858.com 85{
4858.com 86            
4858.com 87            // This job simply prints out its job name and the
4858.com 88            // date and time that it is running
4858.com 89            string jobName = context.JobDetail.FullName;
4858.com 90            
4858.com 91            // Grab and print passed parameters
4858.com 92            JobDataMap data = context.JobDetail.JobDataMap;
4858.com 93            string favoriteColor = data.GetString(FAVORITE_COLOR);
4858.com 94            int count = data.GetInt(EXECUTION_COUNT);
4858.com 95            _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}”, 
4858.com 96                jobName, DateTime.Now.ToString(“r”), favoriteColor, count, _counter));
4858.com 97            
4858.com 98            // increment the count and store it back into the 
4858.com 99            // job map so that job state can be properly maintained
4858.com 100            count++;
4858.com 101            data.Put(EXECUTION_COUNT, count);
4858.com 102            
4858.com 103            // Increment the local member variable 
4858.com 104            // This serves no real purpose since job state can not 
4858.com 105            // be maintained via member variables!
4858.com 106            _counter++;
4858.com 107        }
4858.com 108
4858.com 109    } 
4858.com 110

 

 

比方选拔一个持久的JobStore(在本指南的JobStore章节中商量),那么必须注意存放在JobDataMap中的内容。因为放入JobDataMap中的内容将被系列化,而且简单出现类型转换难题。很醒目,标准.NET类型将是那些安全的,但除外的项目,任什么日期候,只要有人改变了您要连串化其实例的类的概念,就要注意是否打破了程序的包容性。其余,你能够对JobStore和JobDataMap接纳一种选拔形式:便是只把主类型和String类型存放在Map中,那样就足以减掉后边种类化的难题。

看来那你大概会问,那自身如何为二个job提供属性和配备音信呢?并且这么能跟踪保持job的实践景况呢?要应对那一个标题,关键要弄懂JobDataMap,它是JobDetail中的一有个别。

看到这你或者会问,那本人如何为2个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;”>假若你准备利用叁个持久的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: 16px;”>JobDataMap 将JobExecutionContext 作为job执行时候的上下文。它在那之中富含了JobDataMap 和Trigger并且覆盖后边相同的值。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>上边是源于JobExecutionContext获取数据的学业执行进程中集合的JobDataMap的三个简易的事例:

4858.com 1114858.com 112

 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“注入”数据映射值到你的类,它恐怕看起来像这几个:

4858.com 1134858.com 114

 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: 1陆px;”>假若你准备采纳贰个坚韧不拔的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实例化的时候去实例那2个含有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的一个简约的事例:

4858.com 1154858.com 116

 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“注入”数据映射值到您的类,它或许看起来像这些:

4858.com 1174858.com 118

 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中检索值。那是您的抉择。

从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”和“SalesReportForMike”具有“乔joe”和“迈克”在相应JobDataMaps作为输入到各自的job钦点。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>当Trigger运维,将3个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实例”,大家指的是每3个执行job作为“job实例”或“job定义实例”。平时,假如大家只是用这一个词的“job”,我们指的是一个名叫定义或JobDetail等。当大家指的是类实现job接口,我们一直使用的术语“job
type”。

Job “Instances”

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>有的是用户消费时间是纳闷终归是哪些构成了“Job实例”。大家会尽力讲驾驭那里,上边关于的办事情形和并发性的1对。

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;”>比如,你能够创造2个贯彻所谓的“SalesReportJob”的IJob接口的类。这几个job大概会被编码到希望发送给它(通过JobDataMap中)来钦命销售报告应基于销售人士的真名参数。然后它们能够成立三个概念的job(JobDetails),如“SalesReportForJoe”和“SalesReportFor迈克”具有“乔joe”和“Mike”在相应JobDataMaps作为输入到各自的job钦定。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>当Trigger运维,将1个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实例”,大家指的是每1个实践job作为“job实例”或“job定义实例”。常常,假如大家只是用那么些词的“job”,大家指的是3个名叫定义或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类)并发的质量。注意那其间的所说,必须小心使用。在上壹节的事例中,若是“SalesReportJob”有这本性格,比唯有二个“SalesReportForJoe”的实例能够在给定时间实施的,但它能够与“SalesReportFor迈克”的一个实例,同时推行。约束是遵照叁个实例定义(JobDetail等),而不是在工作类的实例。但是,它(quartz的规划),决定对类自己指点的属性,因为它决定对类进行什么样举办编写翻译。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>PersistJobDataAfterExecution是足以被添加到Job类,告诉quartz更新JobDetail的JobDataMap存款和储蓄的副本属性在execute()方法成功做到后(未抛出十二分),使得同1的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;”>于今有一些关于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类)并发的天性。注意那之中的所说,必须小心使用。在上一节的事例中,固然“SalesReportJob”有其壹天性,比唯有贰个“SalesReportForJoe”的实例可以在加以时间实施的,但它可以与“SalesReportFor迈克”的贰个实例,同时施行。约束是依据三个实例定义(JobDetail等),而不是在工作类的实例。可是,它(quartz的统一筹划),决定对类本人指点的性质,因为它决定对类实行怎么样实行编写翻译。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>PersistJobDataAfterExecution是能够被添加到Job类,告诉quartz更新JobDetail的JobDataMap存款和储蓄的副本属性在execute()方法成功完成后(未抛出十分),使得1样的job在下叁遍实践(JobDetail)接收,而不是原本存款和储蓄的值的换代的值。像DisallowConcurrentExecution属性,那适用于作业定义实例,而不是一个作业类的实例,即使当时间控制制让job类辅导的属性,因为它往往使对类是什么样编码的反差(如’有状态’将要求显式地“掌握”的施行措施中的代码)。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”> 

lang=”EN-US”>1经运用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;”>持久性


要是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具有三个寿命由其触发的存在的限制。

style=”font-family: ‘Microsoft YaHei’; font-size: 16px;”>可恢复生机性


一旦作业“供给恢复”,它是在调度的“硬关闭”的时间执行(即它崩溃中运转的长河中,或在机械关闭),然后再度履行当调度程序重新初始。在那种景观下,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(..)方法的有个别细节。你应该从进行办法抛出的绝无仅有项目是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(请求苏醒能力)
-假使2个Job具备“请求苏醒”能力,当它在进行时碰着scheduler
“硬性的关闭”(例如:执行的历程崩溃,也许电脑被关机),那么当scheduler重新运营时,这么些职务会被再一次履行。这种状态下,JobExecutionContext.Recovering 属性将是true。

 

JobListeners(任务监听器) -二个Job要是有0个或许多少个JobListeners监听器与之相关联,当以此Job执行时,监听器被会被布告。愈来愈多关于JobListeners的议论见TriggerListeners
& JobListeners章节。

 

JobExecutionException职分履行十分

说起底,须要报告您有的关于Job.Execute(..)方法的细节。在Execute方法被实践时,仅同意抛出一个JobExecutionException类型相当。由此需求将全部要进行的剧情囊括在贰个’try-catch’块中。应开支一些时光仔细阅读JobExecutionException文档,因为Job能够采纳它向scheduler提供各个指令,你也能够驾驭怎么处理分外。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有