当前位置: 首页 > 编程笔记 >

Java中Spring使用Quartz任务调度定时器

壤驷乐邦
2023-03-14
本文向大家介绍Java中Spring使用Quartz任务调度定时器,包括了Java中Spring使用Quartz任务调度定时器的使用技巧和注意事项,需要的朋友参考一下

Quartz 任务调度是什么

Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目,它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。Quartz 是一个完全由 Java 编写的开源作业调度框架。不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能,但就其简易形式看,你会发现它易用得简直让人受不了!

其实,他还是没有解释明白,我简单说一下:Quartz 作业调度就是可以实现定时任务。它可以实现类似 Windows 的任务计划、我们 .Net 下的 Windows 服务实现的定时任务等,而且,它与 Spring 框架结合起来用起来简单到爆,爽的受不了,除了时间设置比较晦涩一点... 这不重要,待会儿告诉你解决方案。

现在有一个需求:用户在我们系统完成某个操作,我们用金币回馈用户,不过不是即时充值给用户,考虑性能问题,我们用异步或者我们打算在凌晨一点统一充值到用户账户,因为这个时间段用户比较少。你会怎么做?

一、新增一个GoldQuartz.java文件

当然你可以和我一样,新增一个cn.mayongfa.quartz Package 包,专门用来放执行定时任务的类。

这个类的目的是用来定时自动给用户加金币的。

@Component
public class GlodQuartz {

 /**
  * 用户自动加金币
  * 每天凌晨一点执行一次
  */
 @Scheduled(cron = "0 0 1 * * ? ")
 public void addUserGold() {
  System.out.println("凌晨一点了,你睡了么?");
 }

 /**
  * 每隔5秒定时清理缓存
  */
 @Scheduled(cron = "*/5 * * * * ? ")
 public void cacheClear() {
  System.out.println("时间又过去5秒了,真令人伤感...");
 }
}

就完成了?嗯,是的,就这么简单。主要涉及到@Scheduled的cron是什么意思,下面会讲怎么写和怎么自动生成,因为现在这样你完全看不明白。

二、配置springMVC-servlet.xml文件

 <!-- 扫描定时作业调度包 -->
 <task:annotation-driven />
 <context:component-scan base-package="cn.mayongfa.quartz"/>

到这其实就这么简单就完成了!好用的受不了。配置这个<task:annotation-driven />有一个前提是你的 xml 文件的beans声明中要有:

xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
 http://www.springframework.org/schema/task 
 http://www.springframework.org/schema/task/spring-task.xsd"

配置完整版请点击 此处查看。

运行查看结果

到这里你就可以根据自己的需求去完成自己想要执行的定时任务了。那我就来仔细讲讲@Scheduled的cron是什么意思?
Cron 表达式包括以下 7 个字段:秒、分、小时、月内日期、月、周内日期、年(可选字段)。

Cron 触发器还利用一系列特殊字符:

  • 反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。
  • 问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。
  • 在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。
  • 井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。
  • 星号(*)字符是通配字符,表示该字段可以接受任何可能的值。

你肯定要疯了,所有这些定义看起来可能有些吓人,我现在有一个方法让 cron 表达式变得十分简单。要不要听?

有些人为了方便大家快速写出 cron 表达式,他做了一个生成表达式的网站:http://tools.jb51.net/code/Quartz_Cron_create

你去这个网站,可以非常快速的生成一个合适你的 cron 表达式,快去试试吧。

总结一下

当你需要定时执行一些代码的时候,你就可以用到作业调度了,Quartz 就是为这个而生的,而且它和 Spring 结合起来非常方便。让你代码写的飞快,Quartz 还是前几天我们项目组一个同事告诉我的,我使用了一下,我就被他折服了。

上面的代码都可以访问此地址查看完整的项目示例: http://xiazai.jb51.net/201702/yuanma/SpringQuartzDemo_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 项目中有一个要求,该要求将具有将完成某些工作的计划任务。 该项目是基于Spring的,计划的作业将是应用程序大战的一部分。我以前从未实现过这种功能。 我听说过Quartz。此外,我在某处读到Spring提供了一些功能来安排任务。所以,我在想如果我已经在使用Spring,那么为什么要使用其他API(Quartz)。 我不确定使用哪一个?一个比另一个的优缺点是什么? 请提出满足我要求的最佳方式。

  • 在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1、pom包配置 pom包里面只需要引入springboot starter包即可 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

  • 我使用spring调度器任务在固定间隔后调用类中的方法,如下所示 一旦调度程序触发init方法。init方法将使用线程池执行器来执行队列中的所有作业。 问题:执行init方法的初始线程是否会等待init方法中的所有处理(由executor service通过生成新线程来完成)完成? 调度器任务的池大小属性仅用于触发任务,而不是用于执行或处理被触发任务内部的逻辑。

  • 我想每天使用Spring Boot发送电子邮件,用户指定发送时间,我使用石英来安排我的工作。电子邮件的收件人有(id、emailAddress、截止日期)电子邮件将发送给截止日期=今天X...(用户指定X)。例如:用户指定X是1号,所以我们对明天有截止日期的人感兴趣。 第1天:应用程序向截止日期为今天1的人发送电子邮件。。第二天:我希望应用程序在第二天将电子邮件发送给新的收件人,但使用下面的代码,

  • 我目前遇到一个问题,而使用@调度(cron)注释在Spring。 此任务每天凌晨3点(周一至周五)执行: 03:00:00278-03:00:08269 03:00:08269-03:00:15451 我的问题是,为什么这个任务执行两次?我已经说过,它应该只在分钟“0”和“0”秒运行,但这似乎是错的(请参阅执行时间)。我有两个这样的任务,都有这个问题。有没有人知道发生这种情况的原因以及如何避免?

  • 我想我并不完全理解计时器和TimerTask在Java和Android中是如何工作的。现在,我定义了一些定期任务,在一个计时器内安排。 我想知道我应该使用单个计时器来安排任务,还是为每个任务使用不同的计时器实例?计时器有自己的线程吗?是否在新线程中执行计划的任务?背景中发生了什么? 这些方法有什么不同? 方法1的示例代码: 方法2的示例代码: