Quartz简单入门
1、依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、使用
package org.sang.quartz;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyFirstJob {
public void sayHello() {
System.out.println("MyFirstJob:sayHello:"+new Date());
}
}
package org.sang.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Date;
public class MySecondJob extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context){
System.out.println("hello:"+name+":"+new Date());
}
}
Job 可以是一个普通的 JavaBean,如果是普通的 JavaBean,那么可以先添加@Component 注解 将之注册到 Spring 容器中。 Job 也可以继承抽象类 QuartzJobBean,若继承自 Quartz}obBean,则需 要实现该类中的 executelnternal 方法,该方法在任务被调用时使用。
package org.sang.quartz;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.SimpleTrigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.*;
@Configuration
public class QuartzConfig {
@Bean
MethodInvokingJobDetailFactoryBean jobDetail1() {
MethodInvokingJobDetailFactoryBean bean =
new MethodInvokingJobDetailFactoryBean();
bean.setTargetBeanName("myFirstJob");
bean.setTargetMethod("sayHello");
return bean;
}
@Bean
JobDetailFactoryBean jobDetail2() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(MySecondJob.class);
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("name","sang");
bean.setJobDataMap(jobDataMap);
bean.setDurability(true);
return bean;
}
@Bean
SimpleTriggerFactoryBean simpleTrigger() {
SimpleTriggerFactoryBean bean =
new SimpleTriggerFactoryBean();
bean.setJobDetail(jobDetail1().getObject());
bean.setRepeatCount(3);
bean.setStartDelay(1000);
bean.setRepeatInterval(2000);
return bean;
}
@Bean
CronTriggerFactoryBean cronTrigger() {
CronTriggerFactoryBean bean =
new CronTriggerFactoryBean();
bean.setJobDetail(jobDetail2().getObject());
bean.setCronExpression("* * * * * ?");
return bean;
}
@Bean
SchedulerFactoryBean schedulerFactory() {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
SimpleTrigger simpleTrigger = simpleTrigger().getObject();
CronTrigger cronTrigger = cronTrigger().getObject();
bean.setTriggers(simpleTrigger,cronTrigger);
return bean;
}
}
JobDetail 的配直有两种方式:第一种方式通过 MethodlnvokingJobDetailFactoryBean 类配直 JobDetail,只需要指定 Job 的实例名和要调用的方法即可,注册这种方式无法在创建 JobDetail 时传递参数;第二种方式是通过JobDetailF actoryBean 来实现的,这种方式只需要指定JobClass 即可,然后可以通过 JobDataMap 传递参数到 Job 中, Job 中只需要提供属性名,并且提供一 个相应的 set 方法即可接收到参数。
• Trigger 有多种不同实现,这里展示两种常用的 Trigger: SimpleTrigger 和 CronTrigger,这两 种 Trigger 分别使用 SimpleTriggerFactoryBean 和 CronTriggerFactoryBean 进行创建。 在 SimpleTriggerFactoryBean 对象中,首先设直 JobDetail,然后通过 setRepeatCount 配直任务 循环次数, setStartDelay 配置任务启动延迟时间, setRepeatlnterval 配直任务的时间间隔。 在 CronTriggerF actory Bean 对象中,则主要配直 JobDetail 和 Cron表达式。
• 最后通过 SchedulerFactoryBean 创建 SchedulerFactory,然后配直 Trigger 即可。