这是一篇关于如何编码使程序在特定时间启动,并以一定时间间隔为单位多次启动的Blog。
一、使用TimerTasker
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
try {
// 添加需要调用的方法
} catch (Exception e) {
e.printStackTrace();
}
}
};
上面是所要完成的程序的主体,接下来配置定时任务的执行时间。
下图实例表示第一次启动是在2018年6月1日早上10点整,每隔24小时执行一次。
new Timer().schedule(timerTask, new Date(118, 5, 1, 10, 0, 0), 24 * 60 * 60 * 1000);
注意schedule(TimerTask, Long, Long)中第二个参数我们使用了Date对象。该对象采用(year, month, date, hourOfDay, minute, second)的形式。需要注意两点,年这一传参应该是减掉1900之后的数字,月这一传参是0-based的。第三个参数的单位是毫秒,所以如果想表示成秒不要忘记乘以1000.
不过Date这个方式eclipse一直提示deprecated,不建议再使用。所以有另一种替换方式,使用Calendar对象。注意我们自己是不能创建Calendar对象的,必须使用getInstance()方法。月这一传参还是0-based的。下图实例仍然表示第一次启动是在2018年6月1日早上10点整,每隔24小时执行一次。
Calendar calendar = Calendar.getInstance();
calendar.set(2018, 5, 1, 10, 0, 0);
new Timer().schedule(timerTask, calendar.getTime(), 24 * 60 * 60 * 1000);
二、使用Quartz框架
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzCronTiggerJobTest {
public static void main(String[] args) {
try {
// 得到默认的调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 定义当前调度器的具体作业对象
JobDetail jobDetail = JobBuilder.newJob((Class<? extends org.quartz.Job>) TestJob.class)
.withIdentity("cronTriggerDetail", "cronTriggerDetailGrounp").build();
// 定义当前具体作业对象的参数
JobDataMap jobDataMap = jobDetail.getJobDataMap();
jobDataMap.put("name", "cronTriggerMap");
jobDataMap.put("group", "cronTriggerGrounp");
// 作业的触发器
// 在任务调度器中,使用任务调度器的 CronScheduleBuilder 来生成一个具体的 CronTrigger 对象
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger", "cronTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 10 * * ? 2018")).build();
// 注册作业和触发器
scheduler.scheduleJob(jobDetail, cronTrigger);
// 开始调度任务
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
在JobDetail语句中定义想要被触发的类的名字,在本例中为TestJob.class,已标红。
下面是TestJob.class的配置,将任务放在execute()方法之中。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJob implements Job{
public void execute(JobExecutionContext jobContext) throws JobExecutionException {
//需要被重复调度的任务
}
}
Cron表达式是以5个或者6个空格隔开,分成6个或7个域,每个域代表一个时间域。Cron表达式有以下两种语法格式:
1. Seconds Minutes Hours DayofMonth Month DayofWeek Year
2. Seconds Minutes Hours DayofMonth Month DayofWeek
* :表示匹配任意值。比如在Seconds域中配置为*,则表示每秒执行。(可用于任意域)
?:只能用在 DayofMonth和DayofWeek,表示匹配该域的任意值。
注意DayofMonth和DayofWeek不能同时出现限定值,其中之一必须以?表示,否则机器无法确认你的意图。
版权声明:本文为博主原创文章,未经博主允许不得转载。https://mp.youkuaiyun.com/postedit/80743456