A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】学成在线-第19天-讲义-分布式事务 五

3 Spring Task定时任务
3.1需求分析
根据分布式事务的研究结果,订单服务需要定时扫描任务表向MQ发送任务。本节研究定时任务处理的方案,并实现定时任务扫描任务表并向MQ发送消息。
实现定时任务的方案如下:
1、使用jdkTimerTimerTask实现
可以实现简单的间隔执行任务,无法实现按日历去调度执行任务。
2、使用Quartz实现
Quartz 是一个异步任务调度框架,功能丰富,可以实现按日历调度。
3、使用Spring Task实现
Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支持注解编程方式。
本项目使用Spring Task实现任务调度。
3.2 Spring Task串行任务
3.2.1 编写任务类
Spring boot启动类上添加注解:@EnableScheduling
新建任务测试类TestTask,编写测试方法如下:

[AppleScript] 纯文本查看 复制代码
@Component
public class ChooseCourseTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ChooseCourseTask.class);
// @Scheduled(fixedRate = 5000) //上次执行开始时间后5秒执行
// @Scheduled(fixedDelay = 5000) //上次执行完毕后5秒执行
// @Scheduled(initialDelay=3000, fixedRate=5000) //第一次延迟3秒,以后每隔5秒执行一次
@Scheduled(cron="0/3 * * * * *")//每隔3秒执行一次
public void task1(){
LOGGER.info("===============测试定时任务1开始===============");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("===============测试定时任务1结束===============");
}

测试:
1、测试fifixedRatefifixedDelay的区别
2、测试串行执行的特点
3.2.2 cron表达式

cron表达式包括6部分:
秒(0~59) 分钟(0~59) 小时(0~23) 月中的天(1~31) 月(1~12) 周中的天
(填写MONTUEWEDTHUFRISAT,SUN,或数字1~7 1表示MON,依次类推)
特殊字符介绍:
“/”字符表示指定数值的增量
“*”字符表示所有可能的值
“-”字符表示区间范围
"," 字符表示列举
字符仅被用于月中的天和周中的天两个子表达式,表示不指定值
例子:
0/3 * * * * * 每隔3秒执行
0 0/5 * * * * 每隔5分钟执行
0 0 0 * * * 表示每天0点执行
0 0 12 ? * WEN 每周三12点执行
0 15 10 ? * MON-FRI 每月的周一到周五1015分执行
0 15 10 ? * MON,FRI 每月的周一和周五1015分执行
3.2.3 串行任务测试
参考 task1方法的的定义方法,再定义task2方法,此时共用两个任务方法。
[AppleScript] 纯文本查看 复制代码
 @Scheduled(fixedRate = 3000) //上次执行开始时间后5秒执行
public void task2(){
LOGGER.info("===============测试定时任务2开始===============");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info("===============测试定时任务2结束===============");
}


通过测试发现,两个任务方法由一个线程串行执行,task1方法执行完成task2再执行。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马