思考一个问题
现在有一个需求,需要每天在零点定时执行一些操作,让我实现的话,我会这么做:
public void run(){
//获取当前时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS");
Calendar calendar = new GregorianCalendar(2017,9,28,0,0,0);
Date today = new Date(calendar.getTimeInMillis());
//不断循环,判断时间
while(true){
Date now = new Date();
if(now.equals(today)){
//TODO 时间到,执行相关代码
calendar.add(Calendar.DAY_OF_MONTH, 1);
today = new Date(calendar.getTimeInMillis());
}
}
}
但是,有没有已经开源的,封装好的,功能强大的定时任务呢?答案是有的,那就是Quartz.
Quartz的简单介绍
Quartz 是一种功能丰富的,开放源码的作业调度库,可以在几乎任何Java应用程序集成,从最小的独立的应用程序到规模最大电子商务系统。Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是十万的作业数,作业被定义为标准的Java组件,可以执行几乎任何东西,可以编程让它们执行。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
Quartz 是可自由使用,使用Apache 2.0 license授权方式。
如果应用程序需要在给定时间执行任务,或者如果系统有连续维护作业,那么Quartz是理想的解决方案。
使用Quartz作业调度应用的示例:
- 驱动处理工作流程:作为一个新的订单被初始化放置,调度作业到在正好两个小时内,它将检查订单的状态,如果订单确认消息尚未收到命令触发警告通知,以及改变订单的状态为“等待的干预”。
- 系统维护:调度工作给数据库的内容,每个工作日(节假日除外平日)在11:30 PM转储到一个XML文件中。
- 在应用程序内提供提醒服务。
如何使用Quartz
实现Job
Quartz作业定义要运行什么?
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloJob implements Job
{
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Hello Quartz!");
}
}
Quartz触发器
- SimpleTrigger – 允许设置开始时间,结束时间,重复间隔。
SimpleTrigger – 每5秒运行。
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName", "group1")
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5).repeatForever())
.build();
- CronTrigger – 允许UNIX cron表达式来指定日期和时间来运行作业。
CronTrigger – 每5秒运行。
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("dummyTriggerName", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
Scheduler
调度类链接“工作”和“触发器”到一起,并执行它。
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
练习代码地址:https://github.com/wayss000/PracticeCode/tree/master/quartzdemo/helloworld
Quartz的高级特点
- 作业调度
- 作业执行
- 作业持久性
- 事务
- 集群
- 监听器和插件
最后
最后附上学习Quartz思维导图
参考资料:
Quartz教程:http://www.yiibai.com/quartz/
慕课网视频:http://www.imooc.com/learn/846