之前做项目时为了解决一个bug想到了定时从服务器发起消息到Android客户端的想法,当时方案有问题然后就没用定时任务。但却暗暗地在心里记下了这个需求,最近看Java学习路线时恍然间看到Spring Task,就想起好像这玩意好像就是定时任务,这才开始学了下。的确,Spring Task挺轻量的,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式。Spring Task可以定时、间隔时间执行任务,感觉这东西还挺强大,挺好用的,就收集了corn表达式,然后就写了个Demo,供需要的朋友和自己参照。
Eclipse新建Maven project,点击Next
选中Create a simple project选项,选择默认的工作控件,点击Next
在Group Id填写包名,Artifact Id填写项目名,点击Finish
Maven项目创建好之后,打开pom.xml文件,填写如下代码,将jar包导入项目
org.springframework
spring-context
4.2.4.RELEASE
org.springframework
spring-beans
4.2.4.RELEASE
项目结构大致如下:
在资源路径下新建spring的配置文件spring.xml,将如下代码复制到里面:
3.1、配置Bean创建定时任务
1)新建任务类Task
package com.steven.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 在配置文件中创建bean来启动
* @author Windows
*
*/
public class Task {
public void excuteTask(){
System.out.println("20秒的时候启动"+new SimpleDateFormat("hh:mm:ss").format(new Date())+"..........");
}
public void print(){
System.out.println("print,"+new SimpleDateFormat("hh:mm:ss").format(new Date())+".....");
}
}
2)在spring.xml文件中创建bean,并配置方法调用时间
3)创建启动类TaskExcute
package com.steven.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TaskExcute {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("classpath:/spring.xml");
}
}
4)运行启动程序TaskExcute后,慢慢的就能看到Console下面定时执行的任务了。
3.2、采用注解方式创建定时任务
1)创建任务类Task2,定义每分钟的5-7,21-25秒定时执行
package com.steven.demo;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 采用注解方式启动
*/
@Component("task2")
public class Task2 {
//采用注解形式
//每分钟的5-7秒每秒执行一次执行,21-25秒每秒执行一次
@Scheduled(cron = "5-7,21-25 * * * * ?")
public void print2(){
System.out.println("注解形式--print2,"+new SimpleDateFormat("hh:mm:ss").format(new Date())+".......");
}
}
2)在spring.xml文件中beans标签里面追加如下代码,配置开启注解扫描
3)运行TaskExcute方法,开启定时任务
demo最终结构如下:
corn表达式包含6/7个属性,分别以空格隔开:秒、分、时、日期(月份天数)、月、星期、年(可选)
秒: 必填项,范围0-59,支持的特殊符号 , - * /
分: 必填项,范围0-59,支持的特殊符号 , - * /
时: 必填项,范围0-23,支持的特殊符号 , - * /
日期: 必填项,范围1-31,支持的特殊符号 ,- * ? / L W C
月: 必填项,范围1-12(JAN-DEC),支持的特殊符号 , - * /
星期: 必填项,允许1~7 (SUN-SAT),1代表星期天(一星期的第一天),支持的特殊符号 , - * ? / L C #
年: 可选项,范围1970~2099,支持的特殊符号 , - * /
1、*:代表所有可能的值
2、-:指定范围 例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
3、,:列出枚举 例如在分钟里,"5,15"表示5分钟和20分钟触发
4、/:指定增量 例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
5、?:表示没有具体的值,使用?要注意冲突(日期和星期的冲突)
6、L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
7、W:只能用在月份中,表示最接近指定天的工作日 例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份
8、LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五
9、#:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五
10、C:允许在日期域和星期域出现。这个字符依靠一个指定的“日历”。也就是说这个表达式的值依赖于相关的“日历”的计算结果,如果没有“日历”关联,则等价于所有包含的“日历”。如:日期域是“5C”表示关联“日历”中第一天,或者这个月开始的第一天的后5天。星期域是“1C”表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)
项目代码已上传,可供各位下载参考。
CSDN地址
Github地址