Spring(一)定时任务--基于注解
1.导入Spring的基础jar包
2.配置文件,引入task命名空间
<!-- 1.指定spring定时任务扫描的包 -->
<context:component-scan base-package="com.spring.task"></context:component-scan>
<!-- 2.开启定时任务注解驱动 ,多任务需配置线程池 -->
<task:annotation-driven scheduler="MyTask" />
<task:scheduler id="MyTask" pool-size="3"/>
3.定义第一个任务TestTaskA.java
package com.credit.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class TestTaskA {
@Scheduled(cron="0/5 * * * * ?")
public void TestRun() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"---现在执行线程1,每15秒执行一次:");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4.定义第二个任务TestTaskB.java
package com.credit.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class TestTaskB {
@Scheduled(cron="0/20 * * * * ?")
public void TestRun2() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"---现在执行线程2,每20秒执行一次:");
}
}
5.没有配置线程池(默认单线程)执行时间上会有问题
6.配置了线程池,执行没有问题
Spring(一)定时任务--基于XML配置文件
1.配置文件<!-- 1.指定spring定时任务扫描的包 -->
<context:component-scan base-package="com.spring.task"></context:component-scan>
<!--
2.配置定时任务,多任务需配置线程池
ref:指定关联的要执行的任务类,注意第一个字母必须小写
method:指定在该类中要运行的任务方法
cron:定时任务时间表达式
fixed-delay:从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
fixed-rate:从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
-->
<task:scheduled-tasks scheduler="MyTask">
<task:scheduled ref="testTaskA" method="TestRun" cron="0/5 * * * * ?"/>
<task:scheduled ref="testTaskB" method="TestRun2" cron="0/20 * * * * ?"/>
</task:scheduled-tasks>
<task:scheduler id="MyTask" pool-size="2"/>
2.定义第一个任务TestTaskA.java
package com.credit.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.springframework.stereotype.Component;
@Component
public class TestTaskA {
public void TestRun() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"---现在执行线程1,每15秒执行一次:");
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3.定义第二个任务TestTaskB.java
package com.credit.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.stereotype.Component;
@Component
public class TestTaskB {
public void TestRun2() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"---现在执行线程2,每20秒执行一次:");
}
}
4.配置了线程池,执行结果
Spring(一)定时任务--cron常用表达式
0 0 12 * * ? | 每天中午12点执行 |
0 30 11 * * ? | 每天上午11:30执行 |
0 0 14 * * ? 2020 | 2020年每天下午2点执行 |
0 0 6,12,18 * * ? | 每天6点12点18点执行 |
0 0/30 1-8 * * ? | 每天上午1点到8点每30分钟执行 |
0 0 16 ? * FRI | 每周五16点执行 |
0 0 23 L * ? | 每月最后一日的23点执行 |
0 0 15 ? * MON-FRI | 每周一到周五15点执行 |