Quartz的使用
一丶导入quartz_jar包
二丶定义一个Quartz的任务类
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
public class MyJob implements Job {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
// 定义Quartz任务
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//获取任务名称
JobKey key = context.getJobDetail().getKey();
System.out.println("key"+key);
//获取传递过来的参数
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
System.out.println("name:" + dataMap.getString("name"));
System.out.println("age:" + dataMap.getInt("age"));
//System.out.println("name:" + name);
//System.out.println("age:" + age);
//System.out.println();
}
}
写一个类然后实现 Job接口,重写execute方法 可以通过context来获取任务名和传过来的参数,如写了set,get方法可以直接通过封装的字段名获取。
三丶使用定义的任务
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
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;
import com.znsd.quartz.utils.MyJob;
/**
* SimpleTrigger
* @author Liuyl
*如果你需要在一个指定时间段内执行一次作业任务
*或是在指定的时间间隔内多次执行作业任务,
*SimpleTrigger应该能满足你的调度需求。
*/
public class Demo2 {
public static void main(String[] args) throws SchedulerException, ParseException {
//创建任务实例 withIdentity("MyJob", "group"),任务名,分组名
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("MyJob", "group")
//传递数据,通过键值对方式传递
.usingJobData("name", "牛逼")
.usingJobData("age",20)
.build();
//设定结束时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date endtime = sdf.parse("2019-07-17 10:02:00");
//创建一个触发器设置开始执行时间,每个5秒执行一次,总共执行10次。
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("triggerDemo1", "group1")
//在什么时候开始任务
.startAt(new Date())
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever())
//结束时间
.endAt(endtime)
.build();
//创建调度器
Scheduler scheduler=new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(job,trigger);
//启动
scheduler.start();
}
}
SimpleTrigger属性和方法
属性 | 说明 |
---|---|
jobKey | 获取任务名称 |
Identity | 设置表示列,对应withIdentity()方法 |
stratTime | 设置开始时间,对应startAt()方法 |
endTime | 设置结束时间,对应endAt()方法 |
Priority | 优先级设置。对应withPriority()方法 |
Cron表达式
Cron表达式由6~7个由空格分隔的时间元素组成。第7个元素可选
位置 | 字段含义 | 范围 | 允许的特殊字符 |
---|---|---|---|
1 | 秒 | 0-59 | , . * / |
2 | 分钟 | 0-59 | , . * / |
3 | 小时 | 0-23 | , . * / |
4 | 日 | 1-31 | , . * / L W C |
5 | 月 | 1-12或JAN | , . * / |
6 | 星期几 | 1-7或SUN-STA | , . * / L C # |
7 | 年 | 1970-2099 | , . * / |
CronTrigger使用
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.znsd.quartz.utils.MyJob;
/**
* Cron表达式
*
“ - ”中划线,表示一个范围
“ , ”使用逗号间隔的数据,表示一个列表
“ * ”表示每一个值,它可以用于所有字段。在小时字段表示每小时。
“ ? ”该字符仅用于“月份中的哪一天”字段和“星期几”字段,表示不指定值
“ / ”通常表示为x/y,x为起始值,y表示值的增量。
“ L ”表示最后一天,仅在日期和星期字段中使用
“ # ”只能用于“星期几”字段,表示这个月的第几个周几。例如:“6#3”指这个月第三个周五
* @author Liuyl
*
*/
public class Demo3 {
public static void main(String[] args) throws SchedulerException {
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group").build();
//周一至周五,早上9点到下午18点,每2秒钟执行一次。
String cronString = "0/2 * 9-18 ? * MON-FRI";
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule(cronString)).forJob(job).build();
//创建调度器
Scheduler scheduler=new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(job,trigger);
//启动
scheduler.start();
}
}
与spring框架一起整合
首先导入需要的jar包
这里我导入的包有些多有些不是必须包我也导了
定义一个任务类
public class SpringJob {
// 定义Quartz任务
public void testJob() {
//执行的任务
System.out.println("spring Job");
}
}
配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义任务 -->
<bean id="myjob" class="com.znsd.quartz.utils.SpringJob"></bean>
<!-- 添加任务 -->
<bean id="jobDetail1"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myjob" />
<property name="targetMethod" value="testJob" />
</bean>
<!-- 配置SimpleTrigger任务调度器 -->
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail1" />
<property name="startDelay" value="1000" />
<property name="repeatInterval" value="2000" />
</bean>
<!-- 配置CronTrigger任务调度器 -->
<bean id="crontestJobTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail1" />
<property name="cronExpression" value="0/2 * * * * ?" />
</bean>
<!-- 配置触发器开始 -->
<bean id="startQuertz"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
<ref bean="crontestJobTrigger" />
</list>
</property>
</bean>
</beans>
加载spring.xml文件任务会自动被加载
public class Demo4 {
public static void main(String[] args) throws SchedulerException {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
}
}