一. Quartz 实现作业调度
JavaSE 实现定时任务调度有很多缺点,故一般都采用 Quartz 框架实现作业调度。
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,
它可以与J2EE与J2SE应用程序相结合也可以单独使用。
一.一 Quartz 如何实现的作业调度?
抛开 Quartz 框架不谈,我们想在企业级项目里面,引入作业调度,应该怎么做呢?
有三个主要的因素: 1,要做什么, 2 什么时候做, 3 将什么时候做与做什么关联起来。
我们需要有一个对象A, 这个对象里面有一个方法,来执行我们定义的作业任务, 这个对象是做什么。
我们还需要有一个对象B,这个对象里面定义了很多时间属性,如 哪个时间点做,距离现在多长时间之后做,
什么时候结束,要做几次,多长时间做一次, 这个对象是 什么时候做。
我们还需要有一个对象C, 这个对象需要将对象A与对象B关联起来,形成 ‘什么时候做哪件事’ 这样的关系,
同时这个对象C还可以控制这个关联,如开启,关闭,挂起,结束挂起等。
我们需要定义这三个主要的对象,这三个对象之间耦合度不高,每一个对象实现自己特有的功能。
实际上,Quartz 框架 也是这么处理的。
对象A,要做什么, 就是 JobDetail
对象B,什么时候做, 就是Trigger
对象 C, 将什么时候做与做什么关联起来,就是 Scheduler
Quartz 实现作业调度的 核心,就是 JobDetail,Trigger,Scheduler 三个接口。
幸运的是,Quartz已经实现了这三个接口,开发者只需要重写 对象A,即重写 要做什么 即可,
这个要做什么,就是我们开发中,实际要执行的作业, 我们需要实现 Quartz提供的 Job接口即可。
一.二 Quartz 具体实现作业调度
(采用的是 Maven 创建项目)
一.二.一 pom.xml 中添加依赖
要想使用 quartz 框架,则需要引入 quartz相应的依赖, 用的是 2.3.2 版本。
<!--quartz-jobs 依赖--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.2</version> </dependency> <!--quartz 核心依赖--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
依赖关系为:
有一个 c3p0连接池,可以做任务的持久化处理。
提示: 最好再添加一个关于日志的依赖 和log4j.properties 文件
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency>
一.二.二 编写自定义作业 MyJob
就是编写,要做什么了, 需要实现 org.quartz.Job 类
package com.yjl.job; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; import java.util.Date; /** * package: com.yjl.job * className: MyJob * Description: 请输入相应的描述 * * @author : 两个蝴蝶飞 * @Date :2020/4/20 19:53 */ public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("备份数据库的时间是:"+dateString); } }
一.二.二 编写主体测试类 SchedularDemo1
大概需要五个步骤。
- 获取Scheduler
- 创建JobDetail
- 创建Trigger
- 通过Scheduler,将JobDetail和Trigger关联起来
- 启动任务
package com.yjl.demo; import com.yjl.job.MyJob; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; /** * package: com.yjl.demo * className: SchedularDemo1 * Description: 请输入相应的描述 * * @author :两个蝴蝶飞 * @Date :2020/4/20 20:24 */ public class SchedularDemo1 { public static void main(String[] args) throws Exception { //1.获取Scheduler Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler(); //2.创建 JobDetail,要做什么 JobDetail jobDetail=JobBuilder.newJob(MyJob.class) .withIdentity("job1","group1") .withDescription("第一个自定义作业任务描述") .build(); //3.创建 Trigger,什么时候做 Trigger trigger= TriggerBuilder.newTrigger() .withIdentity("trigger1","group1") //设置标识 .startNow() //立刻做 .withSchedule(SimpleScheduleBuilder.simpleSchedule(). //每隔2s重复执行, 无限不停止 withIntervalInSeconds(2).repeatForever()) .withDescription("第一个触发器描述") .build(); //4.关联 job和 trigger scheduler.scheduleJob(jobDetail,trigger); //5.启动 scheduler scheduler.start(); } }
一.二.三 测试运行
运行程序,控制台打印输出:
会按照原计划设计的那样,每隔2s打印一下当前日期。
谢谢您的观看!!!