Quartz--任务调度的实现(实例+源码+惊喜)

首先,说一下什么叫做任务调度    询问度娘中....

看了一下,度娘说的还挺啰嗦的,实在不懂的可以去问问度娘,在这我就不粘贴了。

就我的话来说,任务调度,就是在一个合适的时机去执行一项任务,当然这个时机是有计划的。例如,你定了一个闹钟,到了指定的时间闹钟就会响,这就是一个任务的调度,包括指定的时机(闹钟定的时间),任务的进行及完成(闹钟响,你起床)。当然,这只是其中的一种理解....好了废话不多说,进入正题:

Quartz是一个完全由java编写的开源作业调度框架。不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!(这是度娘的说法)

不过,看了这篇文章之后,你也会觉得它足够简单

说道Quartz,不得不提到它的两个对象:

 Job   工作任务 ,你要做什么  

 Trigger   执行工作任务 触发条件  什么时间执行, 多久执行一次  

在你的Job接口实现类里面,添加一些逻辑到execute()方法。一旦你配置好Job实现类并设定好调度时间表,Quartz将密切注意剩余时间。当调度程序确定该是通知你的作业的时候,Quartz框架将调用你Job实现类(作业类)上的execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用任何特定的东西。仅仅执行任务和结束任务即可。如果配置你的作业在随后再次被调用,Quartz框架将在恰当的时间再次调用它。

在实际开发中的应用(举个栗子):

1.商城的促销活动,当你设置一个商品限时打折之后,务必会在活动结束之后将商品恢复原价,这就需要设置一个Trigger(在活动结束时执行一个任务,即Job),还需要设置一个Job(执行的事情就是将商品恢复原价)。

2.再比如,QQ上,到了你的生日或者你好友的生日,都会给你发出提醒,这使用了任务调度。

知道了要做什么事,接下来就开怼吧:

在这里,我给出的例子是ssm框架+Quartz任务调度的一个简单实现,撇开ssm不说(有没有,都不影响你的练习),Quartz的代码大概就是以下内容(也不能说是大概内容,可以说是全部内容吧,不要问我为什么,度娘说了:“你会发现它易用得简直让人受不了”):

图中一共提到了两种配置任务调度的方法(图中已经介绍的很详细了),这么看着不方便的话,你可以把图片下载下来,一边理解一边看,顺着线条找到思路。

下面是代码:

Quartz需要的依赖:

<!-- Quartz任务调度 -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.2.1</version>
		</dependency>

spring配置文件  applicationContext.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" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd ">

	<!-- 扫描包 -->
	<context:component-scan base-package="com.cc" />
	
	<!-- 第一种   创建重复定时任务  循环的时间段 -->
	<bean id="updateHotMovie" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
 		<property name="jobClass" value="com.cc.job.UpdateHotMovie" />
 	</bean>
 	
 	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
 		<property name="jobDetail" ref="updateHotMovie" /> <!-- 工作细节 -->
 		<property name="startDelay" value="0" />  <!-- 启动延迟 -->
 		<property name="repeatInterval" value="10000" />  <!-- 重复间隔 -->
 	</bean>
 	<!-- 固定 -->
	<!-- <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="jobFactory" ref="jobFactory" />
		<property name="triggers">
			<list>
				<ref bean="simpleTrigger"/>
			</list>
		</property>
	</bean> -->
	
<!--===========================================================-->
	
	<!-- 第二种  : 使用cron表达式配置时间  可以是时间段,也可以是时间点-->
	<bean id="delUglyMovie" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">  
	    <property name="jobClass" value="com.cc.job.DelUglyMovie"/>  
	    <!--工作数据地图-->
		<property name="jobDataAsMap">  
	         <map>  
			    <!--超时时间-->
	            <entry key="timeout" value="5"/>
	         </map>  
	    </property>  
	</bean> 
	<!-- 调度触发器 -->
	<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
		<property name="jobDetail" ref="delUglyMovie"></property> 
		<property name="cronExpression" value="0 0,2 * * * ? "></property> <!-- cron表达式,设置时间  http://cron.qqe2.com/-->
	</bean>
	<!-- 调度工厂   固定-->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="jobFactory" ref="jobFactory" />   <!-- 自定义的jobFactory为了防止注入失败的问题 -->
		<property name="triggers">
			<list>
				<ref bean="simpleTrigger"/>
				<ref bean="cronTriggerBean" />
			</list>
		</property>
	</bean>

</beans>


自定义的工厂类  JobFactory :

package com.cc.job;

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
import org.springframework.stereotype.Service;

@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {

	@Autowired
	private AutowireCapableBeanFactory capableBeanFactory;

	/*创建工作实例 固定*/
	@Override
	protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		// 调用父类的方法
		Object jobInstance = super.createJobInstance(bundle);
		// 进行注入
		capableBeanFactory.autowireBean(jobInstance);
		return jobInstance;
	}

}

任务类  DelUglyMovie :


package com.cc.job;

import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Service;

/**
 * @author peng   2018年4月2日
 * 删除难看的
 */
@Service
public class DelUglyMovie implements Job{

	/* (non-javadoc)
	 * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
	 */
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		
		System.out.println("执行DelUglyMovie");
		System.out.println(new Date());
		
	}
}

任务类  UpdateHotMovie :

package com.cc.job;

import java.util.List;

import javax.annotation.Resource;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Service;

import com.cc.domain.Movie;
import com.cc.service.MovieService;

/**
 * @author peng   2018年4月2日
 * 
 */
@Service
public class UpdateHotMovie implements Job{
	
	@Resource
	private MovieService movieService;

	/* (non-javadoc)
	 * @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
	 */
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.out.println("执行定时任务");
		List<Movie> movies = movieService.findAll();
		for (Movie movie : movies) {
			System.out.println(movie);
		}
	}
	
}

顺便告诉你个事,文中也提到了一个叫做cron表达式的东东,它是什么,你可以百度一下,然后你会发现,知道是什么了之后不会写怎么办,我会告诉你,莫慌,看法宝: http://cron.qqe2.com,这是一个自动生成cron表达式的地方,怎么操作,看了就知道了,一般人我不告诉他....


java就像一盒巧克力,你永远不知道,ta还爆出什么bug....
以上内容均为个人所述,如有不妥,欢迎指正,谢谢





猜你喜欢

转载自blog.csdn.net/HELLOMRP/article/details/79797372