Quartz 任务调度框架之Hello World
0x01 什么是Quartz?
Quartz是一个完全由java编写的开源作业调度框架。
0x02 实战Quartz Hello World
创建Maven项目,POM 文件配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xingyun</groupId> <artifactId>quartz.sample</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Quartz Sample</name> <dependencies> <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> </dependencies> </project>
创建一个定时需要执行的作业
HelloJob.java
import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job{ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //打印当前的执行时间 例如 2017-11-23 00:00:00 Date date = new Date(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("现在的时间是:"+ sf.format(date)); //具体的业务逻辑 System.out.println("Hello Quartz"); } }
这个作业很简单,定时打印当前时间。
由于时间有关,因此我们需要一个工具类来做时间格式转化
import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; public class DateUtil { /** * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss * * @param strDate * @return */ public static Date strToDateLong(String strDate) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ParsePosition pos = new ParsePosition(0); Date strtodate = formatter.parse(strDate, pos); return strtodate; } }
主方法调用
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SimpleScheduleBuilder; import org.quartz.SimpleTrigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class MainTest { public static void main(String[] args) { // TODO Auto-generated method stub try { //创建一个jobDetail的实例,将该实例与HelloJob Class绑定 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build(); //创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行 SimpleTrigger trigger = TriggerBuilder. newTrigger(). withIdentity("myTrigger"). startNow(). endAt(DateUtil.strToDateLong("2018-11-06 16:56:22")). withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever()).build(); //创建schedule实例 StdSchedulerFactory factory = new StdSchedulerFactory(); Scheduler scheduler = factory.getScheduler(); scheduler.start(); scheduler.scheduleJob(jobDetail,trigger); } catch (SchedulerException e) { // TODO Auto-generated catch block System.out.println(e.toString()); } } }
值得注意的一点:
我们定时任务从
2018-11-06 16:55:22开始任务调度当定时任务到
2018-11-06 16:56:22 之前停止任务调度
也就是说endAt 的含义是 当执行到 2018-11-06 16:56:20 时发现到达我们设置的终点值,此时终止任务调度。
而不是恰好等于2018-11-06 16:56:22
打印结果:
*********************
交流即分享,分享才能进步!
不对之处,还请各位前辈多多指教。
by 星云
********************