最近的项目中应用到了Quartz框架,用下来觉得此框架非常的强大,无论是应用在桌面应用程序或者web程序中,都能够解决一些比较棘手的问题。例如在报表统计中,实时查询在大数据量的情况下速度慢的令人发指,单纯从SQL语句上进行优化仍然无法达到要求,这时候可以考虑设计日报表或者月报表,在凌晨进行统计,这时候就可以用Quartz框架进行此工作。(其实也可以在数据库中应用job做同样的工作,在此不讨论)。
Quartz中主要有4个概念:调度器、任务、任务细节和触发器
Scheduler(调度器)是Quartz框架的核心,所有的任务计划都由调度器来进行最终控制,一般来说一个程序中只需要一个调度器,一个调度器中可以管理多个计划任务,每一个计划任务在Quartz中被切分为任务细节+执行计划,我们需要执行的代码通常是放置在JobDetail(任务细节)中执行,而执行计划通常指的是Trigger(触发器),每一对JobDetail+Trigger构成一个完整的计划任务,由调度器来负责执行。
log4j-1.2.14.jar --log4j日志
slf4j-api-1.6.1.jar --slf4j api,可以让我们自由使用java自带log,以及log4j包
slf4j-log4j12-1.6.1.jar --slf4j整合log4j
log4j.xml --log4j日志配置文件
- Quartz一些基本概念
Quartz中主要有4个概念:调度器、任务、任务细节和触发器
Scheduler(调度器)是Quartz框架的核心,所有的任务计划都由调度器来进行最终控制,一般来说一个程序中只需要一个调度器,一个调度器中可以管理多个计划任务,每一个计划任务在Quartz中被切分为任务细节+执行计划,我们需要执行的代码通常是放置在JobDetail(任务细节)中执行,而执行计划通常指的是Trigger(触发器),每一对JobDetail+Trigger构成一个完整的计划任务,由调度器来负责执行。
- Quartz使用
我使用的版本是2.0.2,要使用Quartz至少应该包括以下的Jar包和配置文件
log4j-1.2.14.jar --log4j日志
slf4j-api-1.6.1.jar --slf4j api,可以让我们自由使用java自带log,以及log4j包
slf4j-log4j12-1.6.1.jar --slf4j整合log4j
log4j.xml --log4j日志配置文件
quartz.properties --quartz配置文件
上代码:
package quartz;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.text.ParseException;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzDemo {
public static void main(String[] args) throws SchedulerException {
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
JobDetail job = newJob(MyJob.class)
.withIdentity("job1", Scheduler.DEFAULT_GROUP).build();
try {
Trigger trigger = newTrigger()
.withIdentity("trigger1", Scheduler.DEFAULT_GROUP)
.withSchedule(cronSchedule("* * * * * ?")).build();
scheduler.scheduleJob(job, trigger);
} catch (ParseException e) {
e.printStackTrace();
} catch (SchedulerException e) {
e.printStackTrace();
}
scheduler.start();
}
}
package quartz;
import java.util.Date;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job{
Logger logger = Logger.getLogger(MyJob.class);
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.error(arg0.getJobDetail().getKey() +"调用计划任务在:" + new Date());
}
}