Quartz实现定时任务
quartz框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。
- SimpleTrigger为需要简单打火调度而设计。如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。
- 如果你有许多复杂的作业调度,那么或许需要CronTrigger。
在pom.xml中添加依赖
代码语言:javascript复制<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.4</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
方式一:直接采取配置文件的方式
- job可通过普通类来实现
任务类
代码语言:javascript复制@Component
@Configurable
@EnableScheduling
public class ScheduledTasks{
public void reportCurrentTime(){
System.out.println ("Scheduling Tasks Examples: The time is now " dateFormat ().format (new Date()));
}
//每1分钟执行一次
public void reportCurrentByCron(){
System.out.println ("Scheduling Tasks Examples By Cron: The time is now " dateFormat ().format (new Date ()));
}
private SimpleDateFormat dateFormat(){
return new SimpleDateFormat ("HH:mm:ss");
}
}
触发器配置类
代码语言:javascript复制@Configuration
public class quartzconfiguration {
//使用jobDetail工场来制作任务
@Bean(name = "detailFactoryBean")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduledTasks scheduledTasks){
MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean ();
bean.setTargetObject (scheduledTasks);
bean.setTargetMethod ("reportCurrentByCron"); //选择执行的任务,即方法
bean.setConcurrent (false);
return bean;
}
//设置触发器
//将触发器与job绑定 、 利用时间表达式进行定时
@Bean(name = "cronTriggerBean")
public CronTriggerBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean){
CronTriggerBean tigger = new CronTriggerBean ();
tigger.setJobDetail (detailFactoryBean.getObject ());
try {
tigger.setCronExpression ("0/5 * * * * ? ");//每5秒执行一次
} catch (ParseException e) {
e.printStackTrace ();
}
return tigger;
}
//SchedulerFactoryBean:主要的管理的工厂,这是最主要的一个bean。quartz通过这个工厂来进行对各触发器的管理。
//将触发器放入 课表工厂
@Bean
public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
System.err.println (cronTriggerBean[0]);
bean.setTriggers (cronTriggerBean);
return bean;
}
}
方式二:对Quartz进行封装
- 实现job接口的方式来制作任务 重写execute方法
public class ScheduledTasks implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException{
System.out.println ("Scheduling Tasks Examples By Cron: The time is now " dateFormat ().format (new Date ()));
}
private SimpleDateFormat dateFormat(){
return new SimpleDateFormat ("HH:mm:ss");
}
}
触发器的抽象类
代码语言:javascript复制public abstract class BaseCronTrigger extends CronTriggerBean implements Serializable {
private static final long serialVersionUID = 1L;
public void init(){
// 得到任务
JobDetail jobdetail = new JobDetail (this.getClass ().getSimpleName (),this.getMyTargetObject ().getClass ());
this.setJobDetail (jobdetail);
this.setJobName (jobdetail.getName ());
this.setName (this.getClass ().getSimpleName ());
try {
this.setCronExpression (this.getMyCronExpression ());
} catch (java.text.ParseException e) {
e.printStackTrace ();
}
}
public abstract String getMyCronExpression();
public abstract Job getMyTargetObject();
}
触发器的具体类
- 可以根据业务自定义 并且上传给SchedulerFactoryBean
- SchedulerFactoryBean:主要的管理的工厂,这是最主要的一个bean。
- quartz通过这个工厂来进行对各触发器的管理。
//这是一个具体的 已经绑定任务的触发器
@Component
public class InitializingCronTrigger extends BaseCronTrigger implements Serializable {
@Autowired
private org.springframework.scheduling.quartz.SchedulerFactoryBean schedulerFactoryBean;
//用这种方式自动绑定
//注入IOC容器会自动调用器构造方法
public InitializingCronTrigger() {
super.init ();
}
//设置任务cron
@Override
public String getMyCronExpression() {
return "0/5 * * * * ?";
}
//这里体现了控制反转的思想
//将set 变成get的方式
@Override
public Job getMyTargetObject() {
return new ScheduledTasks ();
}
//SchedulerFactoryBean:主要的管理的工厂,这是最主要的一个bean。quartz通过这个工厂来进行对各触发器的管理。
public void parse(){
try {
schedulerFactoryBean.getObject ().pauseAll ();
} catch (SchedulerException e) {
e.printStackTrace ();
}
}
}
配置类
代码语言:javascript复制@Configuration
public class quartzconfiguration {
//SchedulerFactoryBean:主要的管理的工厂,这是最主要的一个bean。quartz通过这个工厂来进行对各触发器的管理。
//将触发器放入 课表工厂
@Bean
public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){
SchedulerFactoryBean bean = new SchedulerFactoryBean();
System.err.println (cronTriggerBean[0]);
bean.setTriggers (cronTriggerBean);
return bean;
}
}