您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:NET火速上手第一课,定时调整类别

新葡亰496net:NET火速上手第一课,定时调整类别

发布时间:2019-06-19 12:40编辑:奥门新萄京娱乐场浏览(143)

          

    当学完第二课之后,你欣喜的发现,让jobs工作起来是还是相当简单的。虽然让jobs运行起来很简单,对于其执行的关键内容还是需要知道的。它们是IJob接口中的Execute和JobDetails。

    当学完第二课之后,你欣喜的发现,让jobs工作起来是还是相当简单的。虽然让jobs运行起来很简单,对于其执行的关键内容还是需要知道的。它们是IJob接口中的Execute和JobDetails。

    一. 背景

    style="font-size: 16px;"> Quartz.NET快速上手第一课(官网文档翻译)

     

     

      我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用"、"每隔2分钟轮询查数据库看某业务是否被审核通过,并提示用户"等等。

           

    当你定义一个实现IJob接口的类的时候,你需要在里面实现实际需要执行的代码。Quartz.NET需要知道关于这代码的各种信息,这样 Quartz.NET才能像你期望的那样工作。这些细节是在JobDetail类中进行了描述,在上一节以及进行了简单的描述。

    当你定义一个实现IJob接口的类的时候,你需要在里面实现实际需要执行的代码。Quartz.NET需要知道关于这代码的各种信息,这样 Quartz.NET才能像你期望的那样工作。这些细节是在JobDetail类中进行了描述,在上一节以及进行了简单的描述。

      以上需求在开发中都非常常见,但它们仅仅属于低端一点的需求,稍高端一点的需求比如:" 客服派车给调度,如果调度3天内没有执行任何操作,需要提示调度要抓紧派车了 ",到这一步为止看起来和上面的需求并没有什么两样,但如果我要求,系统管理员可以动态配置提示时间呢?即管理员可以配置调度几天没有执行任何操作,系统需要给出提示。这么一改的话,对于一些新手而已,难度就陡然上升了。

    style="font-size: 16px;">原文链接

     

     

      下面我们接着升级需求,系统中有A、B、C、D。。。。等等多个业务,系统管理员可以动态配置每个业务的执行时间情况(如:每隔2s执行一次、每月3号执行一次等等),并且可以动态的控制每个业务的开启、关闭、暂停、全部关闭、全部暂停等。需求升级到这个程度,估计新手就抓虾了,有一定经验的人但是没有接触过类似框架,面对这样的需求,也需要一点时间去研究。

        

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

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

    解惑:

    style="font-size: 18px; color: #800080;">  需求1:也就是我们常说的定时任务,简单一点的可以借助Timer类来实现,对时间要求复杂的需要借助第三方的框架来实现,如:Quartz.Net.

    style="font-size: 18px; color: #800080;">  需求2:需要我们动态配置定时任务的执行时间。

    style="font-size: 18px; color: #800080;">  需求3:需要我们自己搭建一个定时调度框架,然后来动态配置任务的开启、关闭和触发器的情况。

     在你使用调度者( style="color: #ff0000; background-color: #ffffff;">scheduler)之前,你需要对它进行实例化(谁能猜到这呢?)。在实例化scheduler时候,你需要使用 style="color: #ff0000;">ISchedulerFactory。

     

     

      需求三就是我们最终的目标,即我们要搭建一套通用的定时调度框架,可以手动增加定时任务,配置其触发器,手动控制任务的开启、关闭;或者C/S架构,最终部署成windows服务的形式。

     

    让我们花点时间看Job的机制以及在Quartz.NET中的生命周期。在第一节中已经看到的例子让我们再看一遍:

    让我们花点时间看Job的机制以及在Quartz.NET中的生命周期。在第一节中已经看到的例子让我们再看一遍:

      综上所述:Quartz.Net将是我们的最佳选择。

    style="font-size: 16px;"> 在你实例化好scheduler后。你可以启动、让它处于等待模式以及关闭它。请注意: style="color: #ff0000;">一旦scheduler关闭后,将不能再被重启使用。除非你在实例化新的scheduler。如果scheduler没有被启动触发器不会被启动(Triggers)(Ijob实例对象中的代码也不会被执行),触发器保持为等待状态

     

    新葡亰496net 1新葡亰496net 2

    新葡亰496net 3新葡亰496net 4

    二. Quartz.Net简介

     

     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);
    

    1. Quartz.Net是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。

     1     // construct a scheduler factory
     2     ISchedulerFactory schedFact = new StdSchedulerFactory();
     3     
     4     // get a scheduler
     5     IScheduler sched = schedFact.GetScheduler();
     6     sched.Start();
     7     
     8     // define the job and tie it to our HelloJob class
     9    IJobDetail job = JobBuilder.Create<HelloJob>()
    10         .WithIdentity("myJob", "group1")
    11         .Build();
    12   
    13    // Trigger the job to run now, and then every 40 seconds
    14    ITrigger trigger = TriggerBuilder.Create()
    15       .WithIdentity("myTrigger", "group1")
    16       .StartNow()
    17       .WithSimpleSchedule(x => x
    18           .WithIntervalInSeconds(40)
    19           .RepeatForever())
    20       .Build();
    21       
    22   sched.ScheduleJob(job, trigger);
    

    View Code

    View Code

    它有几大优势:

    style="font-size: 16px;">如上面代码所示,让Quartz.NET工作起来想当简单。在下一节中,我们将会给出Jobs and Triggers的快速预览,这样你就会更清楚的理解上面这段代码。

    现在定义一个HelloJob 如下所示:

    现在定义一个HelloJob 如下所示:

      a.持久化数据库:SQLServer、MySQL、MongoDB、Redis

    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 }
    

      b.集群支持:双机热备

    请注意,在这里给scheduler 一个IJobDetail 实例,它只需要一个job实例就能进行运行。当scheduler执行job的时候,scheduler 会在调用Execute方法之前实例化一个job实例。 能实例化job的前提是job类中需要有个无参的构造函数。还有一个需要注意的是,在job类中定义任何数据字段其实没有什么太大的意义,因为在job的运行期间不会保留这些数据字段。

    请注意,在这里给scheduler 一个IJobDetail 实例,它只需要一个job实例就能进行运行。当scheduler执行job的时候,scheduler 会在调用Execute方法之前实例化一个job实例。 能实例化job的前提是job类中需要有个无参的构造函数。还有一个需要注意的是,在job类中定义任何数据字段其实没有什么太大的意义,因为在job的运行期间不会保留这些数据字段。

      c.支持Web B/S架构和WinForm C/S架构

     

     

      d.trigger可以灵活的控制时间各类苛刻的时间要求

    看到这你或许会问,那我如何为一个job提供属性和配置信息呢?并且这么能跟踪保持job的执行状态呢?要回答这些问题,关键要弄懂JobDataMap,它是JobDetail中的一部分。

    看到这你或许会问,那我如何为一个job提供属性和配置信息呢?并且这么能跟踪保持job的执行状态呢?要回答这些问题,关键要弄懂JobDataMap,它是JobDetail中的一部分。

    1. Quartz.Net框架的使用

     

     

    ①.引入方式:

    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: 16px;">如果你准备使用一个持久的JobStore (JobStore 将在JobStore 部分进行讨论)你应该关注将在JobDataMap放些什么。因为它会被序列化,所以更容易产生版本问题。在标准的版本中是安全的,除此之外,任何人都可以改变你的实体类。所以不得不关心兼容性会被破坏的情况。

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

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">所以你可以把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: 16px;">JobDataMap 将JobExecutionContext 作为job执行时候的上下文。它里面包含了JobDataMap 和Trigger并且覆盖前面相同的值。

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

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面是来自JobExecutionContext获取数据的作业执行过程中合并的JobDataMap的一个简单的例子:

    新葡亰496net 5新葡亰496net 6

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

    新葡亰496net 7新葡亰496net 8

     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接口,并为其添加了一些用于存储和检索基本类型的数据的实用方法。

    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: 16px;">所以你可以把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: 16px;">JobDataMap 将JobExecutionContext 作为job执行时候的上下文。它里面包含了JobDataMap 和Trigger并且覆盖前面相同的值。

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

    style="font-family: 'Microsoft YaHei'; font-size: 16px;">下面是来自JobExecutionContext获取数据的作业执行过程中合并的JobDataMap的一个简单的例子:

    新葡亰496net 9新葡亰496net 10

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

    新葡亰496net 11新葡亰496net 12

     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中检索值。这是你的选择。

      a. 通过NuGet引入搜索Quartz引入相应的程序集。

    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”和“Mike”在相应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实例”,我们指的是每一个执行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;">您可以创建一个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”和“Mike”在相应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实例”,我们指的是每一个执行job作为“job实例”或“job定义实例”。通常,如果我们只是用这个词的“job”,我们指的是一个名为定义或JobDetail等。当我们指的是类实现job接口,我们平时使用的术语“job type”。

      (2.x版本需要引入三个程序集:Common.Logging、Common.Logging.Core、Quartz和一个xsd文件(用于xml配置进行代码提示)

    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”的实例可以在给定时间执行的,但它可以与“SalesReportForMike”的一个实例,同时执行。约束是基于一个实例定义(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;">现在有一些关于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”的实例可以在给定时间执行的,但它可以与“SalesReportForMike”的一个实例,同时执行。约束是基于一个实例定义(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;"> 

    lang="EN-US">如果使用PersistJobDataAfterExecution属性,你应该认真考虑也使用DisallowConcurrentExecution属性,以避免留下什么数据时,同样的job(JobDetail)的两个实例并发执行存储可能的混淆(竞争条件)

      b. 去官网下载源码,通过引入源码的形式进行使用(

    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属性将返回真。

      PS:目前最新版本为3.0.5(2018-06-23),这里采用的是2.6.1 即2x的最后一个版本,3x起支持.netcore,且基本用法发生一些变化,最好使用vs2017

    JobExecutionException

    新葡亰496net:NET火速上手第一课,定时调整类别之Quartz。 style="font-family: 'Microsoft YaHei'; font-size: 16px;">最后,我们需要告诉你的IJob.Execute(..)方法的一些细节。你应该从执行方法抛出的唯一类型是JobExecutionException。正因为如此,你通常应该换execute方法的全部内容以'的try-catch“块。你也应该花一些时间看的JobExecutionException的文档,你的工作可以用它来提供调度各种指令为你想怎么异常进行处理。

    JobExecutionException

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

    ②.基本使用:

      a.创建作业调度池(Scheduler)

      b.创建一个具体的作业即job (具体的job需要单独在一个文件中执行)

      c.创建并配置一个触发器即trigger

      d.将job和trigger加入到作业调度池中

      e.开始调度 start

    1. 官方地址

      官网:

      示例:

    三. 系列章节

      下面我们将一起通过以下几个章节,系统的学习一下Quartz.Net的基本用法、扩展一些高级配置,并且最终从框架的角度来处理定时调度这一类通用的问题,欢迎广大博友前来交流、指正、学习。

      第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现:

    第二节: 比较DateTime和DateTimeOffset两种时间类型并介绍Quartz.Net中用到的几类时间形式(定点、四舍五入、倍数、递增)

    第三节: Quartz.Net五大构件之Scheduler(创建、封装、基本方法)和Job:

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

    第五节: Quartz.Net五大构件之Trigger的四大触发类:

    第六节: 六类Calander处理六种不同的时间场景:

    第七节:Trigger(SimpleTrigger、CronTrigger)哑火策略:

    第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案:

    第九节: 利用RemoteSheduler实现Scheduler跨服务器的远程控制:

    第十节: 利用SQLServer实现Quartz的持久化和双机热备的集群模式:

    第十一节: 封装通用的定时调度框架,实现新增、删除、开启、暂停计划任务:

    第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】):

    !

    • 作者 : Yaopengfei
    • 博客地址 :
    • 声明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
    • 声明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,如需代码请留下你的邮箱

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:NET火速上手第一课,定时调整类别

    关键词: