定时任务清理缓存java_我爱Java系列---【定时任务组件Quartz及使用Quartz定时清除七牛云和Redis中的图片垃圾缓存】...

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 SpringBoot 实现定时任务可以使用 Quartz 框架。Quartz 是一个开源的作业调度框架,可以用来创建简单或复杂的作业调度程序。 下面是使用 Quartz 实现定时任务的步骤: 1. 添加 Quartz 的依赖 在 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> ``` 2. 创建 Job 类 创建一个实现 org.quartz.Job 接口的 Job 类。Job 接口只有一个方法 execute(JobExecutionContext context),该方法会在作业执行时被调用。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 作业要执行的任务 } } ``` 3. 创建 Trigger Trigger 是定义作业调度时间的组件。可以创建多个 Trigger 对象,每个对象对应一个时间表达式。 ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerName", "groupName") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); ``` 上面的代码创建了一个 Trigger 对象,它的名称是 triggerName,所属的组是 groupName。它使用了一个 Cron 表达式,表示每隔 5 秒执行一次作业。 4. 创建 Scheduler Scheduler 是 Quartz 的核心组件,用于管理和调度作业和触发器。创建一个 Scheduler 对象,然后将 Job 和 Trigger 注册到 Scheduler 。 ```java SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "groupName") .build(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); ``` 上面的代码创建了一个 Scheduler 对象,并使用 JobBuilder 和 TriggerBuilder 创建了一个 JobDetail 对象和一个 Trigger 对象。然后将 JobDetail 和 Trigger 注册到 Scheduler ,并启动 Scheduler。 完整的代码示例: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 作业要执行的任务 } } public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "groupName") .build(); } @Bean public Trigger trigger() { return TriggerBuilder.newTrigger() .withIdentity("triggerName", "groupName") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(jobDetail(), trigger()); scheduler.start(); return scheduler; } } ``` 在上面的代码,我们使用了 Spring 的注解 @Bean 来注册 JobDetail、Trigger 和 Scheduler。注意要捕获 SchedulerException 异常。 这样就完成了通过集成 Quartz 来实现 SpringBoot 定时任务的步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值