Quartz 一点小小的理解
2011-03-29 22:02
351 查看
昨天师兄说我们的项目要发布了,没想今天就找我,要我把项目发布到服务器上,让我很汗啊。以前没有干过的事情,第一次做还是很多有压力的。幸好师兄详细的给我演示了一遍,很快就了解了。上传的时候只要把文件发到服务器就可以了,然后直接重启就完事了。真的好简单的。
下午的时候因为要准备入库流程的自动化实现,就看了一下基于Java的开源作业调度框架
Quartz
。最新的版本是2.0,不过考虑到稳定性,最后还是选择了1.8.4。了解这种开源的框架一般就是看文档,然后看示例代码。我先看了一下他的 Quick-start-guide
,主要介绍了一下Quartz的压缩包的文件结构。还有就是它的配置文件,这个看上去很简单,不写都是可以的。看完以后大概的了解了一下他的运行机制,也就是基于多线程,因为他的配置文件中需要配置一个threadPool。简单文档看完以后,就去看他的示例了。
官方总共提供了14个例子,这些例子从简单的Hello World,到复杂的集群应用都有讲到。但是其中最核心的有几个部件:
Job 接口: 所有需要Quartz调度的作业都要事先这个接口,这个接口只有一个方法 execute(JobExecutionContext context). 在
context中可以拿到具体的作业对象以及一些参数。Job分为有状态和无状态两种,默认是无状态的。如果想要有状态就要
实现StatefulJob接口。
JobDetail 类: 这个是Job的详细描述,会包括作业的 name, group,具体的类,还有就是作业的数据Map.框架调度就是它
Scheduler/SchedulerFactory : Scheduler接口是Quartz的调度中心了,他的实例化是由工厂方法实现的。常用的工厂方法是
StdSchedulerFactory。常用的方法是 scheduleJob(JobDetail, Trigger) : 添加作业和相应的触发器,
start():开始调度, shutdown(boolean):中止调度。他需要一个布尔值得参数,来指定中止时对正在运行的作业的处理
方式, true:不终止直到所有的作业的完成, false:立刻终止
Trigger 类 : 这个类和数据库中的触发器的概念是一样的,在某个特定的时间触发某个特定的事件。所以Trigger将指定Job的运行
时间、重复次数、重复间隔等一系列的参数。SimpleTrigger和CronTrigger是用的比较多的两个实现类。他们最主要
的不同就是对 运行时间、重复次数、重复间隔的指定方式。SimplerTrigger就是通过参数指定的,很简单也很容易理解。
CronTrigger是通过一种叫 cronExpression的方式实现的,功能强大但也相应的比较难理解。
有了以上的几个最基本的部件,我们就可以构建起一个作业调度程序了,下面是基本的类图:
![](http://hi.csdn.net/attachment/201103/30/0_13014485176qQ0.gif)
接下来看一段简单的代码:
首先是 Job:
接下是简单的调度示例:
上面的代码就组成了一个最基本的调度处理。
刚开始学的时候,对cronExpression很不理解。于是在网上转了转,发现了一篇很不错的文章,我就不Copy过来了,想了解的大家可以去看看 Quartz Cron 表达式(时间格式的写法)
同时还有一篇不错的介绍Quartz的文章,比我这里讲的好了不少 Quartz简介
我只是第一天了解Quartz,可能有错误的地方,如有误导,深感抱歉。
下午的时候因为要准备入库流程的自动化实现,就看了一下基于Java的开源作业调度框架
Quartz
。最新的版本是2.0,不过考虑到稳定性,最后还是选择了1.8.4。了解这种开源的框架一般就是看文档,然后看示例代码。我先看了一下他的 Quick-start-guide
,主要介绍了一下Quartz的压缩包的文件结构。还有就是它的配置文件,这个看上去很简单,不写都是可以的。看完以后大概的了解了一下他的运行机制,也就是基于多线程,因为他的配置文件中需要配置一个threadPool。简单文档看完以后,就去看他的示例了。
官方总共提供了14个例子,这些例子从简单的Hello World,到复杂的集群应用都有讲到。但是其中最核心的有几个部件:
Job 接口: 所有需要Quartz调度的作业都要事先这个接口,这个接口只有一个方法 execute(JobExecutionContext context). 在
context中可以拿到具体的作业对象以及一些参数。Job分为有状态和无状态两种,默认是无状态的。如果想要有状态就要
实现StatefulJob接口。
JobDetail 类: 这个是Job的详细描述,会包括作业的 name, group,具体的类,还有就是作业的数据Map.框架调度就是它
Scheduler/SchedulerFactory : Scheduler接口是Quartz的调度中心了,他的实例化是由工厂方法实现的。常用的工厂方法是
StdSchedulerFactory。常用的方法是 scheduleJob(JobDetail, Trigger) : 添加作业和相应的触发器,
start():开始调度, shutdown(boolean):中止调度。他需要一个布尔值得参数,来指定中止时对正在运行的作业的处理
方式, true:不终止直到所有的作业的完成, false:立刻终止
Trigger 类 : 这个类和数据库中的触发器的概念是一样的,在某个特定的时间触发某个特定的事件。所以Trigger将指定Job的运行
时间、重复次数、重复间隔等一系列的参数。SimpleTrigger和CronTrigger是用的比较多的两个实现类。他们最主要
的不同就是对 运行时间、重复次数、重复间隔的指定方式。SimplerTrigger就是通过参数指定的,很简单也很容易理解。
CronTrigger是通过一种叫 cronExpression的方式实现的,功能强大但也相应的比较难理解。
有了以上的几个最基本的部件,我们就可以构建起一个作业调度程序了,下面是基本的类图:
![](http://hi.csdn.net/attachment/201103/30/0_13014485176qQ0.gif)
接下来看一段简单的代码:
首先是 Job:
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job{ //需要一个没有参数的构造函数,也就是说底层应该是用到了反射 public HelloJob(){ } @Override public void execute(JobExecutionContext context) throws JobExecutionException { HelloJob job = (HelloJob)context.getJobInstance(); job.sayHello(); System.out.println(job.sayHello()+ " - "+ new Date()); } public String sayHello(){ return "Say hello..."; } }
接下是简单的调度示例:
import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.TriggerUtils; import org.quartz.impl.StdSchedulerFactory; public class SchedulExample { public void run() throws Exception{ System.out.println("------Init------"); //Get the reference of Scheduler SchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); System.out.println("------Init complete-----"); System.out.println("------Schedule Jobs-------"); // computer a time that is on the next round minute Date runTime = TriggerUtils.getEvenMinuteDate(new Date()); // define the job and tie it to our HelloJob class JobDetail job = new JobDetail("job1", "group1", HelloJob.class); // Trigger the job to run on the next round minute SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1", runTime); // Tell quartz to schedule the job using our trigger scheduler.scheduleJob(job, trigger); System.out.println(job.getFullName() + " will run at: " + runTime); // Start up the scheduler (nothing can actually run until the // scheduler has been started) scheduler.start(); System.out.println("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! System.out.println("------- Waiting 90 seconds... -------------"); try { // wait 90 seconds to show jobs Thread.sleep(30L * 1000L); // executing... } catch (Exception e) { } // shut down the scheduler System.out.println("------- Shutting Down ---------------------"); scheduler.shutdown(true); System.out.println("------- Shutdown Complete -----------------"); } public static void main(String[] args){ SchedulExample e = new SchedulExample(); try { e.run(); } catch (Exception e1) { e1.printStackTrace(); } } }
上面的代码就组成了一个最基本的调度处理。
刚开始学的时候,对cronExpression很不理解。于是在网上转了转,发现了一篇很不错的文章,我就不Copy过来了,想了解的大家可以去看看 Quartz Cron 表达式(时间格式的写法)
同时还有一篇不错的介绍Quartz的文章,比我这里讲的好了不少 Quartz简介
我只是第一天了解Quartz,可能有错误的地方,如有误导,深感抱歉。
相关文章推荐
- 数组指针和指针数组的一点小小理解
- 『AngularJS』一点小小的理解
- 对数据结构一点一小小的理解(五)——栈
- c++继承和多态的一点小小的理解
- 对m_hWnd和this指针的一点小小理解
- 对数据结构一点一小小的理解(一)
- 对数据结构一点一小小的理解(三)——C++ 模板库
- 对数据结构一点一小小的理解(七)——二叉树
- 『AngularJS』一点小小的理解
- 对数据结构一点一小小的理解(四)——线性表
- 对数据结构一点一小小的理解(二)——算法分析部分
- 分页机制,一点小小的理解,os 于渊的树上的
- spring的一点小小理解
- AngularJS』一点小小的理解
- 对C语言的一点理解
- 更深入一点理解 switch 语句 及 c/c++ 对 const 的处理
- 关于游戏启动的一点理解
- 关于指针的一点理解
- 我的一点浅见——关于机器的理解