配色: 字号:
从零开始学 Java - Spring 使用 Quartz 任务调度定时器
2016-09-14 | 阅:  转:  |  分享 
  
从零开始学Java-Spring使用Quartz任务调度定时器



睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈。你向生活微笑,生活也向你微笑。

请你不要询问我的未来,这有些可笑。你问我你是不是要找个工作去上班?我告诉你不要,好好享受生活的味道,你所有现在所厌倦的谁说不是别人正羡慕的呢。

Quartz任务调度是什么

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

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

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

开始开发阿乐

一、新增一个GoldQuartz.java文件当然你可以和我一样,新增一个cn.mayongfa.quartz?Package包,专门用来放执行定时任务的类。这个类的目的是用来定时自动给用户加金币的。

@Component

publicclassGlodQuartz{



/

用户自动加金币

每天凌晨一点执行一次

/

@Scheduled(cron="001?")

publicvoidaddUserGold(){

System.out.println("凌晨一点了,你睡了么?");

}



/

每隔5秒定时清理缓存

/

@Scheduled(cron="/5?")

publicvoidcacheClear(){

System.out.println("时间又过去5秒了,真令人伤感...");

}

}

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

二、配置springMVC-servlet.xml文件







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

配置完整版

xsi:schemaLocation=" 0 UTF-8 0.########## yyyy-MM-ddHH:mm:ss true ignore

运行查看结果

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

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

反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第5秒开始,每15秒一次。

问号(?)字符和字母L字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母L字符是last的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。

在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。

井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。

星号()字符是通配字符,表示该字段可以接受任何可能的值。你肯定要疯了,所有这些定义看起来可能有些吓人,我现在有一个方法让cron表达式变得十分简单。要不要听?

总结一下

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



献花(0)
+1
(本文系白狐一梦首藏)