使用Spring Task开发定时任务

        之前做项目时为了解决一个bug想到了定时从服务器发起消息到Android客户端的想法,当时方案有问题然后就没用定时任务。但却暗暗地在心里记下了这个需求,最近看Java学习路线时恍然间看到Spring Task,就想起好像这玩意好像就是定时任务,这才开始学了下。的确,Spring Task挺轻量的,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式。Spring Task可以定时、间隔时间执行任务,感觉这东西还挺强大,挺好用的,就收集了corn表达式,然后就写了个Demo,供需要的朋友和自己参照。

1、创建Maven项目,填写pom.xml文件添加jar包

Eclipse新建Maven project,点击Next

使用Spring Task开发定时任务_第1张图片

选中Create a simple project选项,选择默认的工作控件,点击Next

使用Spring Task开发定时任务_第2张图片

 在Group Id填写包名,Artifact Id填写项目名,点击Finish

使用Spring Task开发定时任务_第3张图片

Maven项目创建好之后,打开pom.xml文件,填写如下代码,将jar包导入项目


    
	org.springframework
	spring-context
	4.2.4.RELEASE
    
    
	org.springframework
	spring-beans
	4.2.4.RELEASE
    

项目结构大致如下:

使用Spring Task开发定时任务_第4张图片

2、创建spring配置文件spring.xml

在资源路径下新建spring的配置文件spring.xml,将如下代码复制到里面:




 

3、编写示例代码,测试

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下面定时执行的任务了。

使用Spring Task开发定时任务_第5张图片

 

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方法,开启定时任务

使用Spring Task开发定时任务_第6张图片

demo最终结构如下:

使用Spring Task开发定时任务_第7张图片

4、cron表达式注解

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地址

 

你可能感兴趣的:(Java)