1.Quartz的介绍
Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。
2.Quartz的使用步骤
1.创建子模块 health-jobs
webapp骨架
2.修改pom.xml文件
引入需要的三方库
3.自定义一个任务类
调用任务类,普通类普通方法
4.增加spring-jobs.xml文件
配置任务对象、调度对象,调度工厂
5.修改web.xml文件
容器启动,加载spring配置文件
3.Quartz的使用演示
本案例基于Quartz和spring整合的方式使用。具体步骤:
(1)创建maven子模块工程health-jobs,骨架webapp
(2)修改pom.xml文件
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
6 itcast_health
7 com.itheima.health
8 1.0-SNAPSHOT
9
10 4.0.0
11
12 health-jobs
13 war
14
15 health-jobs
16
17
18 UTF-8
19 1.7
20 1.7
21
22
23
24
25 com.itheima.health
26 health_common
27 1.0-SNAPSHOT
28
29
30 org.springframework
31 spring-webmvc
32
33
34 org.springframework
35 spring-tx
36
37
38 org.quartz-scheduler
39 quartz
40
41
42 org.quartz-scheduler
43 quartz-jobs
44
45
46 redis.clients
47 jedis
48
49
50 org.springframework
51 spring-context-support
52
53
54 com.qiniu
55 qiniu-java-sdk
56
57
58
59 health-jobs
60
61
62 org.apache.tomcat.maven
63 tomcat7-maven-plugin
64
65 /
66 9003
67
68
69
70
71
(3)自定义一个Job(将来做事的地方,要执行的任务放在这里就行)
main下创建java目录 (刷新maven工程),然后创建com.itheima.health.jobs包,然后新建一个任务调度类ClearImageJob,任务内容暂时做普通打印即可。
/*** 定时任务:在这里定义你想要完成的功能 *public class ClearImageJob {
/**
* 定义清理图片的任务
*/
public void clearImageJob(){
System.out.println("clearImageJob......");
}}
(4)创建配置文件spring-jobs.xml,配置自定义Job、任务描述、触发器、调度工厂等
自动扫包
注册任务对象
注册JobDetail
定义触发器
定义调度工厂
在main下创建resources目录,刷新maven后,在目录下创建spring-jobs.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans6 http://www.springframework.org/schema/beans/spring-beans.xsd7 http://www.springframework.org/schema/context8 http://www.springframework.org/schema/context/spring-context.xsd">
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 0/10 * * * * ?
29
30
31
32
33
34
35
36
37
38
39
(5)修改web.xml,容器启动时,加载spring配置文件
1 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"3 "http://java.sun.com/dtd/web-app_2_3.dtd">
4
5
6 Jobs Web Application
7
8 contextConfigLocation
9 classpath:spring-*.xml
10
11
12 org.springframework.web.context.ContextLoaderListener
13
14
执行上面main方法观察控制台,可以发现每隔10秒会输出一次,说明每隔10秒自定义Job被调用一次。
上面的入门案例中我们指定了一个表达式:0/10 * * * * ?
这种表达式称为cron表达式,通过cron表达式可以灵活的定义出符合要求的程序执行的时间。
4.定时清理垃圾图片
我们在文件上传成功后将图片保存到了一个redis集合中,当套餐数据插入到数据库后我们又将图片名称保存到了另一个redis集合中,通过计算这两个集合的差值就可以 获得所有垃圾图片的名称。本节基于Quartz定时任务,通过计算redis两个集合的差值找出所有的垃圾图片,就可以将垃圾图片清理掉。
实现流程:
1.增加spring-redis.xml
需要进行差值计算
2.修订spring-jobs.xml
修改为每天凌晨2点执行任务
3.增加七牛工具类
增加删除方法
4.修订定时任务类
进行差值计算,对差值结果就是需要清理的图片
操作步骤:
(1) 配置spring-redis.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
5
6
7 200
8
9
10 50
11
12
13
14
15
16
17
18
19
20
(2) 修改spring-jobs.xml,调度时间改为每天凌晨2点执行
0 0 2 * * ?
1
2
3
4
5
6
7
8 0 0 2 * * ?
9
10
(3)增加七牛工具类,删除不用的文件
1 /**
2 * 七牛云工具类3 */
4 public classQiniuUtils {5 public static String accessKey = "fhuiPBXFTZIgJdtZGuMtCUJ3zSrT7k3AHmVNE4UA";6 public static String secretKey = "zKKxCW_HjQmwtl4JI80nMT0Ve2V7VZDbqT4zt_tT";7 public static String bucket = "itcast_health";8
9 /**
10 * 删除文件11 *@paramfileName 服务端文件名12 */
13 public static voiddeleteFileFromQiniu(String fileName){14 //构造一个带指定Zone对象的配置类
15 Configuration cfg = newConfiguration(Zone.zone0());16 String key =fileName;17 Auth auth =Auth.create(accessKey, secretKey);18 BucketManager bucketManager = newBucketManager(auth, cfg);19 try{20 bucketManager.delete(bucket, key);21 } catch(QiniuException ex) {22 //如果遇到异常,说明删除失败
23 System.err.println(ex.code());24 System.err.println(ex.response.toString());25 }26 }27 //测试上传与删除
28 public static void main(String args[]) throwsException{29 //测试删除30 //deleteFileFromQiniu("f5eee75c0c5d4eeda1c5c49bee766603");
31 }32 }
(4)修订ClearJob定时任务类
1 /**
2 * 定时任务:清理垃圾图片3 */
4 public classClearJob {5 @Autowired//idea自动识别,xml文件顶部出现的context中勾选全部xml文件,就能正常识别了6 privateJedisPool jedisPool;7 //清理图片
8 public voidclearImageJob(){9 //计算redis中两个集合的差值,获取垃圾图片名称
10 Set set =jedisPool.getResource()11 .sdiff(RedisConst.SETMEAL_PIC_RESOURCES,12 RedisConst.SETMEAL_PIC_DB_RESOURCES);13 Iterator iterator =set.iterator();14 while(iterator.hasNext()){15 String pic =iterator.next();16 //删除图片服务器中的图片文件
17 QiniuUtils.deleteFileFromQiniu(pic);18 //删除redis中的数据
19 jedisPool.getResource().srem(RedisConst.SETMEAL_PIC_RESOURCES,pic);20 }21 }22 }