Spring Task定时任务

来源:互联网 发布:网络科技产品 编辑:程序博客网 时间:2024/05/18 01:33

Spring框架自带的异步执行(TaskExecutor)和任务调度(TaskScheduler)接口。

task任务调度配置:spring-tasks.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="             http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd           default-lazy-init=">              <context:annotation-config></context:annotation-config>          <!--  spring扫描注解的配置   -->          <context:component-scan base-package="com.levi.test.task"></context:component-scan>                      <!--开启这个配置,spring才能识别@Scheduled注解   -->         <task:annotation-driven mode="proxy" scheduler="testScheduler"></task:annotation-driven>         <task:scheduler id="testScheduler" pool-size="10"></task:scheduler>   </beans>

任务调度实现代码:TestTask.java

package com.levi.test.task; import java.text.SimpleDateFormat;;import java.util.Calendar;import java.util.Date; import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component; @Component("TestTask")public class TestTask {         //每天凌晨4:40执行    @Scheduled(cron = "0 40 4 * * ?")    public void TestTask() {    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");      Date factInPlaceDate = new Date();         Calendar beforeCd = Calendar.getInstance();      beforeCd.setTime(factInPlaceDate);      beforeCd.add(Calendar.MONTH, -1);      Date beforeFactDate = beforeCd.getTime();     String beforeMonthDate = sdf.format(beforeFactDate);    System.out.println("实际到位日期减一个月:" + beforeMonthDate);             Calendar afterCd = Calendar.getInstance();      afterCd.setTime(factInPlaceDate);      afterCd.add(Calendar.MONTH, +1);      Date afterFactDate = afterCd.getTime();     String afterMonthDate = sdf.format(afterFactDate);    System.out.println("实际到位日期加一个月:" + afterMonthDate);   }  }
在spring 4.x中已经不支持7个参数的cronin表达式了,要求必须是6个参数。cron表达式的格式如下:

{秒} {分} {时} {日期(具体哪天)} {月} {星期}
  • 秒:必填项,允许的值范围是0-59,支持的特殊符号包括
     ,
    - * / , , 表示特定的某一秒才会触发任务, - 表示一段时间内会触发任务, * 表示每一秒都会触发, / 表示从哪一个时刻开始,每隔多长时间触发一次任务。
  • 分:必填项,允许的值范围是0-59,支持的特殊符号和秒一样,含义类推
  • 时:必填项,允许的值范围是0-23,支持的特殊符号和秒一样,含义类推
  • 日期:必填项,允许的值范围是1-31,支持的特殊符号相比秒多了 ? ,表示与{星期}互斥,即意味着若明确指定{星期}触发,则表示{日期}无意义,以免引起冲突和混乱。
  • 月:必填项,允许的值范围是1-12(JAN-DEC),支持的特殊符号与秒一样,含义类推
  • 星期:必填项,允许值范围是1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此类推,7代表星期六,支持的符号相比秒多了 ? ,表达的含义是与{日期}互斥,即意味着若明确指定{日期}触发,则表示{星期}无意义。

比如下面这个cron表达式:

// 表达的含义是:每半分钟触发一次任务30 * * * * ?

0 0
原创粉丝点击