从零开始学 Java - Spring 使用 Quartz 任务调度定时器
AidenDevill
8年前
<h2><strong>Quartz 任务调度是什么</strong></h2> <p>Quartz 是 OpenSymphony 开源组织在 Job scheduling 领域又一个开源项目</p> <p>它可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。Quartz 是一个完全由 Java 编写的开源作业调度框架。不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能,但就其简易形式看,你会发现它易用得简直让人受不了!</p> <p>摘自百度百科</p> <p>其实,他还是没有解释明白,我简单说一下:Quartz 作业调度就是可以实现 <strong>定时任务</strong> 。它可以实现类似 Windows 的任务计划、我们 .Net 下的 Windows 服务实现的定时任务等,而且,它与 Spring 框架结合起来用起来简单到爆,爽的受不了,除了时间设置比较晦涩一点... 这不重要,待会儿告诉你解决方案。</p> <p>现在有一个需求:用户在我们系统完成某个操作,我们用金币回馈用户,不过不是即时充值给用户,考虑性能问题,我们用异步或者我们打算在凌晨一点统一充值到用户账户,因为这个时间段用户比较少。你会怎么做?</p> <h2><strong>开始开发阿乐</strong></h2> <p>一、新增一个 GoldQuartz.java 文件</p> <p>当然你可以和我一样,新增一个 cn.mayongfa.quartz Package 包,专门用来放执行定时任务的类。</p> <p>这个类的目的是用来定时自动给用户加金币的。</p> <pre> <code class="language-java">@Component public class GlodQuartz { /** * 用户自动加金币 * 每天凌晨一点执行一次 */ @Scheduled(cron = "0 0 1 * * ? ") public void addUserScore() { System.out.println("凌晨一点了,你睡了么?"); } /** * 每隔5秒定时清理缓存 */ @Scheduled(cron = "*/5 * * * * ? ") public void cacheClear() { System.out.println("时间又过去5秒了,真令人伤感..."); } }</code></pre> <p>就完成了?嗯,是的,就这么简单。主要涉及到 @Scheduled 的 cron 是什么意思,下面会讲怎么写和怎么自动生成,因为现在这样你完全看不明白。</p> <p>二、配置 springMVC-servlet.xml 文件</p> <pre> <code class="language-java"><!-- 扫描定时作业调度包 --> <task:annotation-driven /> <context:component-scan base-package="cn.mayongfa.quartz"/></code></pre> <p>到这其实就这么简单就完成了!好用的受不了。配置这个 <task:annotation-driven /> 有一个前提是你的 xml 文件的 beans 声明中要有:</p> <pre> <code class="language-java">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"</code></pre> <p>配置完整版请点击 <a href="/misc/goto?guid=4959715618544126868" rel="nofollow,noindex">https://github.com/mafly/SpringDemo/blob/master/WebContent/WEB-INF/springMVC-servlet.xml</a> 查看。</p> <h2><strong>运行查看结果</strong></h2> <p><img src="https://simg.open-open.com/show/f103564b5bf93adaa449794ceb63d5b6.png"></p> <p>到这里你就可以根据自己的需求去完成自己想要执行的定时任务了。那我就来仔细 <strong> 讲讲 @Scheduled 的 cron 是什么意思? </strong></p> <p>Cron 表达式包括以下 7 个字段:秒、分、小时、月内日期、月、周内日期、年(可选字段) 。</p> <p>Cron 触发器还利用一系列特殊字符:</p> <ul> <li> <p>反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。</p> </li> <li> <p>问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。</p> </li> <li> <p>在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。</p> </li> <li> <p>井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。</p> </li> <li> <p>星号(*)字符是通配字符,表示该字段可以接受任何可能的值。</p> </li> <li> <p><strong>你肯定要疯了,所有这些定义看起来可能有些吓人</strong> ,我现在有一个方法让 cron 表达式变得十分简单。要不要听?</p> </li> </ul> <p>有些人为了方便大家快速写出 cron 表达式,他做了一个生成表达式的网站: <a href="/misc/goto?guid=4959715618663772173" rel="nofollow,noindex">http://www.jeasyuicn.com/cron/</a></p> <p>你去这个网站,可以非常快速的生成一个合适你的 cron 表达式,快去试试吧。</p> <h2><strong>总结一下</strong></h2> <p>当你需要定时执行一些代码的时候,你就可以用到作业调度了,Quartz 就是为这个而生的,而且它和 Spring 结合起来非常方便。让你代码写的飞快,Quartz 还是前几天我们项目组一个同事告诉我的,我使用了一下,我就被他折服了。</p> <p> </p> <p> </p> <p>来自:http://blog.mayongfa.cn/169.html</p> <p> </p>