关于Quartz的配置以及使用
什么是Quartz:
Quartz是一个开源的作业调度框架,可以让计划的程序任务一个预定义的日期和时间运行。
Quartz可以用来创建简单或复杂的日程安排执行几十,几百,甚至是几万的作业数。
Quartz的核心概念:
Quartz对任务调度进行了高度抽象,提出了3个核心概念,并在org.quartz包中通过接口和类进行了描述
1.任务:就是执行的工作内容。Quartz提供Job接口来支持任务定义,Job接口中只有一个execute()方法,开发者需要在自己的任务类中实现该方法。
2.触发器:定义触发Job执行的时间的触发规则。Quartz提供Trigger类及其子类支持触发器功能。
3.调度器:Quartz提供了Scheduler接口,它是Quartz独立运行的容器。将工作任务和触发器注册到调度器中,保证任务可以在正确的时间执行。
代码演示:完成功能,对员工张三的工作任务进行提醒,实现每3秒钟进行一次任务提醒。
1.Quartz需要导入的jar包
一、定义一个Quartz任务,需要实现Job接口。
// Quartz任务
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("该工作了!!!");
}
}
二、调用以上Quartz任务.
public static void main(String[] args) ,{
// 创建一个任务实例(JobDetail)
JobDetail job = JobBuilder.newJob(MyJob.class)
.build();
// 创建一个触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
// 设置为每间隔5秒执行一次Quartz任务
.withIntervalInSeconds(3).repeatForever())
.build();
// 创建调度器(Scheduler)
Scheduler scheduler;
try {
scheduler = new StdSchedulerFactory().getScheduler();
scheduler.scheduleJob(job,trigger);
// 开始执行
scheduler.start();
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以键值对的方式传送参数到Quartz任务
一、使用JobDetail类中的usingJobData方法进行传参。
JobDetail job = JobBuilder.newJob(MyJob.class)
.usingJobData("name","张三")
.build();
二、Quartz任务类中获取参数
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap map = context.getJobDetail().getJobDataMap();
String name = map.getString("name");
System.out.println(name+ ": 该工作了!!!");
}
三、以set方法的方式获取参数
public class MyJob implements Job {
// 增加set方法以后会自动将参数赋值,前提是名称以及类型是一致的。
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
/*
* JobDataMap map = context.getJobDetail().getJobDataMap(); String name =
* map.getString("name");
*/
System.out.println(name+ ": 该吃饭了!!!");
}
}
使用trigger的endTime属性来设置任务的结束时间.
// 使用日期格式化指定时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date endtime = sdf.parse("2019-07-17 10:27:40");
// 创建一个触发器(Trigger)
Trigger trigger = TriggerBuilder.newTrigger()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
// 设置为每间隔5秒执行一次Quartz任务
.withIntervalInSeconds(1).repeatForever())
.endAt(endtime)
.build();
使用CronTrigger
CronTrigger相比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间。
CronTrigger是基于Cron表达式的触发器。Cron表达式实际上是由7个子表达式组成的字符串,描述了时间表的详细信息,这些信息使用空格分开。
一、Cron表达式
Cron表达式的每个字段,都可以显式地规定一个值(如49)、一个范围(如1-6)、一个列表(如1,3,5)或者一个通配符(如*)
二、Cron表达式有几个特殊的字符,说明如下
三、Cron表达式示例
四、创建CronTrigger触发器。
//周一至周五,早上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();
五、CronTrigger和SimpleTrigger的对比
CronTrigger允许用户更精准地控制任务的运行日期和时间,而不仅仅是定义工作的频度。
CronTrigger通过Cron表达式定义准确的运行时间点。
在Spring中使用Quartz
Spring对Quartz提供了支持,对Quartz的核心类进行了封装,使开发人员更便捷地实现任务调度。
使用声明的方式配置计划任务,大大简化了操作步骤,而且也降低了代码耦合。
完成任务:对员工张三的工作任务进行提醒,实现每3秒钟进行一次任务提醒。
一、spring需要导入的jar包
二、外加Quartz的jar包
代码实现
一、在spring中使用Quartz任务对象不需要实现接口。
public class MyJob {
public void testJob1() {
System.out.println("张三该工作了!!!");
}
}
二、1.spring文件中配置SimpleTrigger任务调度器的方法。
<?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 -->
<bean id="myjob" class="com.znsd.job.MyJob" />
<!-- 添加任务 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myjob" />
<property name="targetMethod" value="testJob1" />
</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>
<!-- 配置触发器开始 -->
<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
</beans>
二、2.spring文件中配置CronTrigger任务调度器的方法。
<?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 -->
<bean id="myjob" class="com.znsd.job.MyJob" />
<!-- 添加任务 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myjob" />
<property name="targetMethod" value="testJob1" />
</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 static void main(String[] args) {
ApplicationContext ac =
new ClassPathXmlApplicationContext("spring.xml");
}
以上就是关于Quartz任务调度的内容,感谢阅读。