介绍
如果你的job需要在指定的时间执行,或者要间断的不断地执行,SimpleTrigger就能满足这些需求。比如,让你的触发器在具体时间 触发,几秒执行一次,连续执行几次,这个时候可以使用SimpleTrigger。
SimpleTrigger中的几个参数:JobKey,start-time, end-time, repeat count, 以及repeat interval。
JobKey
表示job实例的标识,触发器被触发时,该指定的job实例会执行
repeat count:
重复次数的设置可以是0, 正数,或者常量SimpleTrigger.REPEAT_INDEFINITELY
repeat interval:
0, 正数,可以设置分钟和毫秒数 。如果repeat interval被设置为0,在trigger 执行repeat count次数的时候会出现trigger并发去触发的情况(调度程序几乎是同时去操作这些trigger)
startTime:
设置trigger触发的时间
endTime
如果指定了endTime这个属性的话,会重写repeat count属性。比如创建一个每10分钟就会触发的trigger,并为这个trigger设置了endTime属性,这样程序就不需要计算在start-time和end-time执行了多少次。可以在指定end-time的同时也将repeat count设置为REPEAT_INDEFINITELY常量(或repeat count指定一个比较大的值,这个值足以超过 trigger在end-time到来之前执行的实际次数)
实例
例子:距离当前5秒后每隔2秒钟执行一次任务10秒后结束
pom包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
- HelloJob
package quartz;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description helloJob
* @Author lss0555
* @Date 2018/8/5/005 19:16
**/
public class HelloJob implements Job{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public void execute(JobExecutionContext context) throws JobExecutionException {
Date date = new Date();
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("HelloJob实例:"+sf.format(date));
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
JobDataMap tDataMap = context.getTrigger().getJobDataMap();
String user = dataMap.getString("user");
// String username = tDataMap.getString("username");
//通过contex里面取出user值
// System.out.println("JobDetail获取传递数据:"+user);
//通过定义username的setter和get方法自动获取username值
// System.out.println("Trigger获取传递数据:"+username);
}
}
- 测试类
public static void main(String[] args) throws SchedulerException {
//创建JobDetail实例 将实例与Hellojob绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("jobName1","group1")
.usingJobData("user","lss")
.build();
//
System.out.println("jobDetail的jobName:"+jobDetail.getKey().getName());
System.out.println("jobDetail的jobGroup:"+jobDetail.getKey().getGroup());
System.out.println("jobDetail的jobClass:"+jobDetail.getJobClass().getName());
//设置trigger开启时间
Date starDate = new Date();
starDate.setTime(starDate.getTime()+5000L);
//设置trigger结束时间
Date endDate = new Date();
endDate.setTime(endDate.getTime()+10000L);
//创建一个Trigge实例,定义Job的执行方式
Trigger trig=TriggerBuilder.newTrigger()
.withIdentity("myTrigger","group1")
.usingJobData("username","lss0555")
//设置立即开启生效
// .startNow()
.startAt(starDate)
//设置结束时间
.endAt(endDate)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()//使用simpleTrigger
.withIntervalInSeconds(2).repeatForever())//2秒钟执行一次,一直运行下去
.build();
//创建Schedule实例
SchedulerFactory sfact = new StdSchedulerFactory();
Scheduler scheduler = sfact.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trig);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前时间:"+sf.format(new Date()));
}
结果
当前时间:2018-08-05 20:58:22
HelloJob实例:2018-08-05 20:58:27
HelloJob实例:2018-08-05 20:58:29
HelloJob实例:2018-08-05 20:58:31