您的位置:首页 > 其它

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的方式实现的,功能强大但也相应的比较难理解。

有了以上的几个最基本的部件,我们就可以构建起一个作业调度程序了,下面是基本的类图:



接下来看一段简单的代码:

首先是 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,可能有错误的地方,如有误导,深感抱歉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: