第四节: Quartz调度器

前面几节简单的介绍了Quartz和其内部的执行过程,内容简单也容易理解,今天正式步入Quartz源码研究刨习,从调度器入手吧!

 

打开代码,先看下代码整体结构:

  

调度器介绍:

Quartz调度器(Scheduler)主要有两个,一个是远程调度器(RemoteScheduler),一个是标准调度器(StdScheduler),它们是由调度工厂完成实例化的,对用户是封闭的。由工厂实例化哪个调度器取决于用户自己的配置。

我们看一下调度工厂的类图:

 

通过类图我们注意到两个调度器其实是对用户不可见的,而且是方便以后扩展的。另外DirectSchedulerFactory工厂是个单例,大家用quartz的时候一般会用过StdSchedulerFactory而很少会用到DirectSchedulerFactory,是因为DirectSchedulerFactory不允许配置,需要用户在代码里配置所有的属性,不太灵活。但对于阅读代码来说,我还是喜欢从DirectSchedulerFactory开始。

 

DirectSchedulerFactory工厂:

DirectSchedulerFactory 相对简单一点,它内部除了实现接口的方法就还有几个调来调去的重载方法:

 

下面我们就用如上图第8个重载函数,来进行实例化调度器,并完成一次作业:

如下代码:

1.job还是用第一节中的MyJob

2.调度代码:

[csharp]  view plain copy
  1. static void Main(string[] args)  
  2.   
  3. {  
  4.   
  5.             //调度器名称  
  6.             conststring SchedulerName = "MySimpScheduler";  
  7.   
  8.             //调度器唯一Id  
  9.             stringSchedulerId = Guid.NewGuid().ToString();  
  10.   
  11.             //实例化简单线程池  
  12.             IThreadPoolsimpleThreadPool = new SimpleThreadPool(5,ThreadPriority.Normal);  
  13.   
  14.             //实例化RAMJobStore  
  15.             IJobStorejobStore = new RAMJobStore();  
  16.   
  17.             //线程执行器  
  18.             IThreadExecutorthreadExecutor = new DefaultThreadExecutor();  
  19.   
  20.    
  21.   
  22.             //调度器  
  23.             DirectSchedulerFactorysf = DirectSchedulerFactory.Instance;  
  24.   
  25.             sf.CreateScheduler(SchedulerName,SchedulerId, simpleThreadPool, threadExecutor, jobStore, null,  
  26.   
  27.                                TimeSpan.Zero,TimeSpan.Zero, 1, TimeSpan.Zero);  
  28.   
  29.    
  30.   
  31.             ISchedulersched = sf.GetScheduler(SchedulerName);  
  32.   
  33.    
  34.   
  35.             //job详情,注意MyJob  
  36.             IJobDetailmyJob = JobBuilder.Create<MyJob>()  
  37.   
  38.                .WithIdentity("job1""group1")  
  39.   
  40.                .Build();  
  41.   
  42.    
  43.   
  44.             //触发器  
  45.             ITriggertrigger = TriggerBuilder.Create()  
  46.   
  47.                 .WithIdentity("trigger1""group1")  
  48.   
  49.                 .WithCronSchedule("/5 * * * * ? ")  
  50.   
  51.                 .Build();  
  52.   
  53.    
  54.   
  55.             //关联job和触发器  
  56.             sched.ScheduleJob(myJob, trigger);  
  57.   
  58.    
  59.   
  60.             //执行  
  61.             sched.Start();  
  62.   
  63.    
  64.   
  65.             Console.Read();  
  66.   
  67.    
  68.   
  69.             //关掉  
  70.             sched.Shutdown(true);  
  71.   
  72. }  


 

3.执行结果:

 

总结:通过以上代码,我们可以看到执行结果和前几节是一样的,只不过我们显示的将配置写到代码中,从代码内容可以看出,调度器工厂在进行实例化调度器的时候都干什了些什么事情。比如有实例化线程池,实例化job存储器,实例化插件,等其它的东东。

 

 

 

代码:

[csharp]  view plain copy
  1. class MyClass3  
  2.    {  
  3.        static void Main(string[] args)  
  4.        {  
  5.            //调度器名称  
  6.            const string SchedulerName = "MySimpScheduler";  
  7.            //调度器唯一Id  
  8.            string SchedulerId = Guid.NewGuid().ToString();  
  9.            //实例化简单线程池  
  10.            IThreadPool simpleThreadPool = new SimpleThreadPool(5, ThreadPriority.Normal);  
  11.            //实例化RAMJobStore  
  12.            IJobStore jobStore = new RAMJobStore();  
  13.            //线程执行器  
  14.            IThreadExecutor threadExecutor = new DefaultThreadExecutor();  
  15.   
  16.            //调度器  
  17.            DirectSchedulerFactory sf = DirectSchedulerFactory.Instance;  
  18.            sf.CreateScheduler(SchedulerName, SchedulerId, simpleThreadPool, threadExecutor, jobStore, null,  
  19.                               TimeSpan.Zero, TimeSpan.Zero, 1, TimeSpan.Zero);  
  20.   
  21.            IScheduler sched = sf.GetScheduler(SchedulerName);  
  22.   
  23.            //job详情,注意MyJobch  
  24.            IJobDetail myJob = JobBuilder.Create<MyJob>()  
  25.               .WithIdentity("job1""group1")  
  26.               .Build();  
  27.   
  28.            //触发器  
  29.            ITrigger trigger = TriggerBuilder.Create()  
  30.                .WithIdentity("trigger1""group1")  
  31.                .WithCronSchedule("/5 * * * * ? ")//每5秒执行一次  
  32.                .Build();  
  33.   
  34.            //关联job和触发器  
  35.            sched.ScheduleJob(myJob, trigger);  
  36.   
  37.            //执行  
  38.            sched.Start();  
  39.   
  40.            Console.Read();  
  41.   
  42.            //关掉  
  43.            sched.Shutdown(true);  
  44.        }  
  45.   
  46.        public class MyJob : IJob  
  47.        {  
  48.            public void Execute(IJobExecutionContext context)  
  49.            {  
  50.                Console.WriteLine("我执行了,时间:{0}", DateTime.Now);  
  51.            }  
  52.        }  
  53.    }  

猜你喜欢

转载自zxb1985.iteye.com/blog/1841379