Quartz笔记
最近碰到了一个场景,需要能够在指定时间执行任务,比如每周周六周日的3点开启一个服务,那么总不能说,把以后的每个周六周日的日期列出来让程序执行吧,所以就百度了一下找到了这么一个开源框架,Qartz,这个东西上手还是蛮简单的,所以打算记录下来
配置
maven的话,比较容易,就添加上项目依赖就好了
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
emmm,maven仓库能搜到的最新的是2.3.0的,但是官网都没出教程= =所以我还是选择了2.2.1,怂一点总没错,况且需要功能不多。
配置文件
这个比较简单,就在resources文件夹里面放一个名字叫quartz.properties
的文件,然后里面写几句话:
org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 3
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
那么第一个就是名字,第二个是最大线程数,就跟那个,线程池一样的东西,第三个是存储方式,他好像是可以把任务存到数据库,也可以存到RAM,我们最终的希望还是存到数据库的,但是RAM是新手教程的方式,所以我就先试试RAM,后面再转JDBC。
运行
这应该是我碰到的最简单的运行方式了
public class Scheduler implements Runnable{
private static org.quartz.Scheduler scheduler;
@Override
public void run() {
try {
// Grab the TaskHandler instance from the Factory
scheduler = StdSchedulerFactory.getDefaultScheduler();
// and start it off
scheduler.start();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
获得一个默认的Scheduler,然后start就行了
然后你就能看到这个:
就启动完成啦
创建一个任务
他的一个任务是叫做,job,顾名思义,就是任务,比如该咋干活,然后啥的,主要是一个任务流程问题,那么我们看一下内部。
public interface Job {
void execute(JobExecutionContext var1) throws JobExecutionException;
}
内部非常简单,一个execute就行啦,所以我们需要做的,就是实现这个任务
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("fin's job");
}
}
我们就创建了一个job,那么当要执行这个任务的时候,就会执行execute了!所以说我们只需要定义好这个execute,就能正确执行我们想要的东西了。
那么这个job怎么放到任务里,他有个builder模式,名称为org.quartz.JobBuilder
,那么我们可以通过这个来构造一个job
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).build();
JobDetail就是我们需要执行的一个任务了,他是通过JobBuilder类的newJob静态方法,将我们实例化的Job给构建出来,然后build后生成我们需要的JobDetail对象。
Job传值
job的builder可以使用usingJobData
方法来进行传值,那么这个东西在框架中被称作:JobDataMap,还是很明显,意思是任务数据map,usingJobData可以理解成Map.put(),前面是key,后面是value。
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.usingJobData("name","finQQ")
.build();
那么我们怎么获得这个值。
只需要这句话:
Map map = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println(map.get("name") + "'s job");
这样就获得了我们需要的数据。同样,builder里面还有很多函数可以供我们选择。
触发器
刚刚Job是做什么,那么Trigger就是什么时候做,我们最需要的就是这个Trigger
创建Trigger也是通过所谓的TriggerBuilder来建立
Trigger trigger = TriggerBuilder.newTrigger()
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
上面就是创建一个触发器。
- startNow 现在开始
- withSchedule 日程表,这个就是决定我们什么时候做什么的,有SimpleSchedule还有CronSchedule,这个就是创建一个每40秒循环一次然后循环到死的普通日程表
- build 构建开始
Schedule
Cronschedule应该是我需要的那种,所以晚点会专门研究一下。。
最后一步
添加我们的job和trigger到工作区
scheduler.scheduleJob(jobDetail, trigger);
效果
可以看到,每隔40秒就打印出了一个消息,下一篇我会根据实际应用写一下我的使用