第四节: Quartz调度器

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

 

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

 

调度器介绍:

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

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

 

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

 

DirectSchedulerFactory工厂:

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

 

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

如下代码:

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

2.调度代码:

static void Main(string[] args)

{

            //调度器名称
            conststring SchedulerName = "MySimpScheduler";

            //调度器唯一Id
            stringSchedulerId = Guid.NewGuid().ToString();

            //实例化简单线程池
            IThreadPoolsimpleThreadPool = new SimpleThreadPool(5,ThreadPriority.Normal);

            //实例化RAMJobStore
            IJobStorejobStore = new RAMJobStore();

            //线程执行器
            IThreadExecutorthreadExecutor = new DefaultThreadExecutor();

 

            //调度器
            DirectSchedulerFactorysf = DirectSchedulerFactory.Instance;

            sf.CreateScheduler(SchedulerName,SchedulerId, simpleThreadPool, threadExecutor, jobStore, null,

                               TimeSpan.Zero,TimeSpan.Zero, 1, TimeSpan.Zero);

 

            ISchedulersched = sf.GetScheduler(SchedulerName);

 

            //job详情,注意MyJob
            IJobDetailmyJob = JobBuilder.Create<MyJob>()

               .WithIdentity("job1", "group1")

               .Build();

 

            //触发器
            ITriggertrigger = TriggerBuilder.Create()

                .WithIdentity("trigger1", "group1")

                .WithCronSchedule("/5 * * * * ? ")

                .Build();

 

            //关联job和触发器
            sched.ScheduleJob(myJob, trigger);

 

            //执行
            sched.Start();

 

            Console.Read();

 

            //关掉
            sched.Shutdown(true);

}


 

3.执行结果:

 

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

 

 

 

代码:

 class MyClass3
    {
        static void Main(string[] args)
        {
            //调度器名称
            const string SchedulerName = "MySimpScheduler";
            //调度器唯一Id
            string SchedulerId = Guid.NewGuid().ToString();
            //实例化简单线程池
            IThreadPool simpleThreadPool = new SimpleThreadPool(5, ThreadPriority.Normal);
            //实例化RAMJobStore
            IJobStore jobStore = new RAMJobStore();
            //线程执行器
            IThreadExecutor threadExecutor = new DefaultThreadExecutor();

            //调度器
            DirectSchedulerFactory sf = DirectSchedulerFactory.Instance;
            sf.CreateScheduler(SchedulerName, SchedulerId, simpleThreadPool, threadExecutor, jobStore, null,
                               TimeSpan.Zero, TimeSpan.Zero, 1, TimeSpan.Zero);

            IScheduler sched = sf.GetScheduler(SchedulerName);

            //job详情,注意MyJobch
            IJobDetail myJob = JobBuilder.Create<MyJob>()
               .WithIdentity("job1", "group1")
               .Build();

            //触发器
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .WithCronSchedule("/5 * * * * ? ")//每5秒执行一次
                .Build();

            //关联job和触发器
            sched.ScheduleJob(myJob, trigger);

            //执行
            sched.Start();

            Console.Read();

            //关掉
            sched.Shutdown(true);
        }

        public class MyJob : IJob
        {
            public void Execute(IJobExecutionContext context)
            {
                Console.WriteLine("我执行了,时间:{0}", DateTime.Now);
            }
        }
    }


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值