Quartz之使用案例

一、任务调度的触发时机

1.每隔指定时间则触发一次

Quartz中对应的触发器为org.springframework.scheduling.quartz.SimpleTriggerBean

​<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="job1" /> 
    <property name="startDelay" value="0" /><!– 调度工厂实例化后,经过0秒开始执行调度 –> 
    <property name="repeatInterval" value="2000" /><!– 每2秒调度一次 –> 
</bean> 

2.每到指定时间则触发一次

Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="job1" /> 
    <!—每天12:00运行一次 —> 
    <property name="cronExpression" value="0 0 12 * * ?" /> 
</bean> 

并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。

二、Quartz定时器核心概念

1.JobDetail,是一个可执行的工作,指定定时类和其中执行方法

2.Trigger,触发器代表一个调度参数的配置,什么时候去调用

3.Scheduler,是一个计划调度器容器,器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。容器里面可以盛放众多的JobDetail和Trigger

4.当JobDetail和Trigger在Scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成),就可以伴随容器启动而调度执行了

三、Quartz作业类的使用方式

1.作业类继承自特定的基类

作业类继承于org.springframework.scheduling.quartz.QuartzJobBean

第一步:定义作业类

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class Job1 extends QuartzJobBean {

	private int timeout;
	private static int i = 0;

	// 调度工厂实例化后,经过timeout时间开始执行调度
	public void setTimeout(int timeout) {
		this.timeout = timeout;
	}

	/**
	 * 要调度的具体任务
	 */
	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		System.out.println("定时任务执行中…");
	}
}

第二步:配置spring配置文件中作业类JobDetailBean 

<bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean"> 
    <property name="jobClass" value="com.mark.Job1" /> <!--在java代码中定义的任务类-->
    <property name="jobDataAsMap"> 
       <map> 
           <entry key="timeout" value="0" /> <!--该任务类中需要注入的属性值-->
       </map> 
    </property> 
</bean> 

第三步:配置作业调度的触发方式(触发器)

 第一种 SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="job1" /> 
    <property name="startDelay" value="0" /><!– 调度工厂实例化后,经过0秒开始执行调度 –> 
    <property name="repeatInterval" value="2000" /><!– 每2秒调度一次 –> 
</bean> 

 第二种 CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="job1" /> 
    <!—每天12:00运行一次 —> 
    <property name="cronExpression" value="0 0 12 * * ?" /> 
</bean> 

第四步:配置调度工厂 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
        <list> 
            <ref bean="cronTrigger" /> <!--指定的就是之前配置的触发器的名字-->
        </list> 
    </property> 
</bean> 

2.作业类即普通的java类,不需要继承自任何基类(推荐)

spring支持的两种实现任务调度的方式

org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean       ------java自带timer task方式

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean      ------Quartz方式

第一步:编写任务类

public class Job2 {
	public void doJob2() {
		System.out.println("不继承QuartzJobBean方式-调度进行中…");
	}
}

 第二步:配置spring配置文件中作业类MethodInvokingJobDetailFactoryBean

<bean id="job2" 
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject"> 
        <bean class="com.mark.Job2" />   <!--指定任务类-->
    </property> 
    <property name="targetMethod" value="doJob2" />   <!--指定运行的方法-->
    <property name="concurrent" value="false" />     <!-- 作业不并发调度 -->
</bean> 

-------下面步骤与第一种方式相同 

第三步:配置作业调度的触发方式(触发器)

 第一种 SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> 
    <property name="jobDetail" ref="job2" /> 
    <property name="startDelay" value="0" /><!– 调度工厂实例化后,经过0秒开始执行调度 –> 
    <property name="repeatInterval" value="2000" /><!– 每2秒调度一次 –> 
</bean> 

 第二种 CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="job2" /> 
    <!—每天12:00运行一次 —> 
    <property name="cronExpression" value="0 0 12 * * ?" /> 
</bean> 

第四步:配置调度工厂 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
        <list> 
            <ref bean="cronTrigger" /> <!--指定的就是之前配置的触发器的名字-->
        </list> 
    </property> 
</bean> 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Quartz是一个开源的任务调度框架,可以用来实现定时任务、延时任务、周期性任务等。下面是一个使用Quartz框架的简单示例: 1. 引入依赖 在项目的pom.xml中添加以下依赖: ``` <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> ``` 2. 编写任务类 Quartz框架需要我们编写一个实现了Job接口的任务类,例如: ``` public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello Quartz!"); } } ``` 3. 配置任务调度器 我们需要创建一个Scheduler对象来配置任务调度器,并将任务类与触发器绑定在一起,例如: ``` public class QuartzTest { public static void main(String[] args) throws SchedulerException { // 创建任务调度器 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); // 创建任务类和触发器 JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) .repeatForever()) .build(); // 将任务类和触发器绑定在一起,并启动调度器 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } } ``` 以上代码中,我们创建了一个名为"job1",所在分组为"group1"的任务,以及一个名为"trigger1",所在分组为"group1"的触发器。触发器的执行时间间隔为10秒,重复执行无限次。 4. 运行程序 运行程序后,我们可以看到每隔10秒钟就会输出一次"Hello Quartz!"。这就说明我们已经成功地使用Quartz框架实现了一个简单的定时任务。 以上是一个简单的Quartz框架使用实例,更复杂的任务调度可以通过配置不同类型的触发器和JobDetail来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值