怎么在mall中使用SpringTask实现一个定时任务
本篇文章给大家分享的是有关怎么在mall中使用SpringTask实现一个定时任务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
SpringTask
SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用。
Cron表达式
Cron表达式是一个字符串,包括6~7个时间元素,在SpringTask中可以用于指定任务的执行时间。
Cron的语法格式
Seconds Minutes Hours DayofMonth Month DayofWeek
Cron格式中每个时间元素的说明
| 时间元素 | 可出现的字符 | 有效数值范围 |
|---|---|---|
| Seconds | , - * / | 0-59 |
| Minutes | , - * / | 0-59 |
| Hours | , - * / | 0-23 |
| DayofMonth | , - * / ? L W | 0-31 |
| Month | , - * / | 1-12 |
| DayofWeek | , - * / ? L # | 1-7或SUN-SAT |
Cron格式中特殊字符说明
| 字符 | 作用 | 举例 |
|---|---|---|
| , | 列出枚举值 | 在Minutes域使用5,10,表示在5分和10分各触发一次 |
| - | 表示触发范围 | 在Minutes域使用5-10,表示从5分到10分钟每分钟触发一次 |
| * | 匹配任意值 | 在Minutes域使用*, 表示每分钟都会触发一次 |
| / | 起始时间开始触发,每隔固定时间触发一次 | 在Minutes域使用5/10,表示5分时触发一次,每10分钟再触发一次 |
| ? | 在DayofMonth和DayofWeek中,用于匹配任意值 | 在DayofMonth域使用?,表示每天都触发一次 |
| # | 在DayofMonth中,确定第几个星期几 | 1#3表示第三个星期日 |
| L | 表示最后 | 在DayofWeek中使用5L,表示在最后一个星期四触发 |
| W | 表示有效工作日(周一到周五) | 在DayofMonth使用5W,如果5日是星期六,则将在最近的工作日4日触发一次 |
业务场景说明
用户对某商品进行下单操作;
系统需要根据用户购买的商品信息生成订单并锁定商品的库存;
系统设置了60分钟用户不付款就会取消订单;
开启一个定时任务,每隔10分钟检查下,如果有超时还未付款的订单,就取消订单并取消锁定的商品库存。
整合SpringTask
由于SpringTask已经存在于Spring框架中,所以无需添加依赖。
添加SpringTask的配置
只需要在配置类中添加一个@EnableScheduling注解即可开启SpringTask的定时任务能力。
packagecom.macro.mall.tiny.config;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.scheduling.annotation.EnableScheduling;
/**
*定时任务配置
*Createdbymacroon2019/4/8.
*/
@Configuration
@EnableScheduling
publicclassSpringTaskConfig{
}添加OrderTimeOutCancelTask来执行定时任务
packagecom.macro.mall.tiny.component;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.scheduling.annotation.Scheduled;
importorg.springframework.stereotype.Component;
/**
*Createdbymacroon2018/8/24.
*订单超时取消并解锁库存的定时器
*/
@Component
publicclassOrderTimeOutCancelTask{
privateLoggerLOGGER=LoggerFactory.getLogger(OrderTimeOutCancelTask.class);
/**
*cron表达式:SecondsMinutesHoursDayofMonthMonthDayofWeek[Year]
*每10分钟扫描一次,扫描设定超时时间之前下的订单,如果没支付则取消该订单
*/
@Scheduled(cron="00/10*?*?")
privatevoidcancelTimeOutOrder(){
//TODO:2019/5/3此处应调用取消订单的方法,具体查看mall项目源码
LOGGER.info("取消订单,并根据sku编号释放锁定库存");
}
}以上就是怎么在mall中使用SpringTask实现一个定时任务,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注恰卡编程网行业资讯频道。
推荐阅读
-
4个理由告诉你Java为何排行第一
本文由码农网 –单劼原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!Java已经有20年的历史了,甚...
-
写给精明Java开发者的测试技巧
我们都会为我们的代码编写测试,不是吗?毫无疑问,我知道这个问题的答案可能会从“当然,但你知道怎样才能避免写测试吗?”到“必须...
-
Java 微服务框架 Redkale 入门介绍
Redkale功能Redkale虽然只有1.xM大小,但是麻雀虽小五脏俱全。既可作为服务器使用,也可当工具包使用。作为独立的工...
-
Java内存管理原理及内存区域详解
一、概述Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁...
-
2015年Java开发岗位面试题归类
下面是我自己收集整理的Java岗位今天面经遇到的面试题,可以用它来好好准备面试。一、Java基础1.String...
-
Java 虚拟机类加载机制和字节码执行引擎
引言我们知道java代码编译后生成的是字节码,那虚拟机是如何加载这些class字节码文件的呢?加载之后又是如何进行方法调用的呢?...
-
Java常量池理解与总结
一.相关概念什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态...
-
Java 实现线程死锁
概述春节的时候去面试了一家公司,笔试题里面有一道是使用简单的代码实现线程的‘死锁’,当时没有想到这道题考的是Sync...
-
Java:过去、未来的互联网编程之王
Java对你而言是什么?一门你大学里学过的语言?一个IT行业的通用语言?你相信Java已经为下一次互联网爆炸做好了准备么?Java...
-
20个高级Java面试题汇总
本文由码农网 –小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!这是一个高级Java面试系列题中...
