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 * * * * ?