使用Spring Task开发定时任务

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

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

Eclipse新建Maven project,点击Next

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

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

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

<dependencies>
    <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>4.2.4.RELEASE</version>
    </dependency>
    <dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-beans</artifactId>
	<version>4.2.4.RELEASE</version>
    </dependency>
</dependencies>

项目结构大致如下:

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

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
            http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">

</beans>

 

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,并配置方法调用时间

    <!-- 定时任务开关 -->
    <task:annotation-driven />
    
    <!-- 创建bean对象 -->
    <bean id="task" class="com.steven.demo.Task"></bean>
    <!-- ref参数是配置的任务类bean的id,method是需要运行的方法,cron是cronExpression表达式  -->
    <task:scheduled-tasks >   
        <!-- 每隔5秒执行一次print方法 --> 
        <task:scheduled ref ="task" method="print" cron= "*/5 * * * * ?"/> 
        <!-- 每分钟的第20秒准时调用executeTask方法 -->
        <task:scheduled ref ="task" method="excuteTask" cron= "20 * * * * ?" />   
    </task:scheduled-tasks >

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标签里面追加如下代码,配置开启注解扫描

    <!-- 注解扫描 -->
    <context:component-scan base-package="com.steven.demo" />

3)运行TaskExcute方法,开启定时任务

demo最终结构如下:

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

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值