之前的代码已完成基础功能,但仍有一些逻辑未完善:
定时任务:
- 用户下单15分钟后仍未支付,订单判定为超时。status应修改为6(已取消)。
- 管理端忘记点击"完成",使订单长时间处于"派送中"状态。系统需每天定时清理该类订单,status修改为5(已完成)。
可使用Sping框架提供的工具Spring Task来定时处理一些任务。
弹窗任务:
- 来单提醒:用户下单并支付后,管理端需弹出窗口提示有新订单。
- 客户催单:用户下单并支付后,可点击"催单",管理端会弹出窗口提示接单。
可以通过WebSocket协议来实现客户端浏览器和服务器之间进行双向的数据传输。
Spring Task
Spring Task是Spring框架提供的一个任务调度工具,可以按照约定的时间自动执行某个代码逻辑,属于定时任务框架。 其作用类似于手机上的闹钟,即定时自动执行指定的java代码。
指定代码要在哪个时间点触发可以通过cron表达式来确定。
cron表达式
Cron表达式是一个强大的时间表达式,用于定义定时任务的执行时间。它由六个或七个字段(域)组成,中间以空格分隔,每个字段代表一个时间单位,分别为秒、分、时、日、月、周、年(其中年可选)。其本质上就是一个字符串,通过cron表达式可以定义任务触发的时间。
Cron表达式中使用了一些特殊字符来表示复杂的时间规则:
- 星号(*):表示所有可能的值。例如,在“小时”字段中,*表示每小时。
- 问号(?):表示不指定的值,只能用于日和周字段。例如在周字段中使用?,表示不指定具体是周几。
- 连字符(-):表示一个范围。例如,在“小时”字段中,1-5表示从1点到5点。
- 逗号(,):表示列表值。例如,在“周”字段中,Mon,Wed,Fri表示周一、周三和周五。
- 斜杠(/):用于指定增量。例如,在“分”字段中,0/15表示从0分钟开始,每15分钟执行一次。
一些特殊的字符:
- L:表示最后。只能用于日和月字段。在月字段中表示一个月的最后一天;在周字段中表示一个星期的最后一天(即星期六)。如果L前有具体的内容,如“6L”,则表示该月的倒数第6天。
- W:表示有效工作日(周一到周五)。只能用于日字段,系统将在离指定日期的最近的有效工作日触发事件。例如在日字段使用5W,如果5日是休息日,则将在最近的工作日(即星期五,4日)触发;如果是工作日,则就在5日触发。
- LW:表示某个月最后一个工作日,即最后一个星期五。
- #:用于确定每个月第几个星期几。它只能出现在DayofMonth字段中。例如,“4#2”表示某月的第二个星期三。
一般日和周字段必须有一个为"?",例如每月1号早上9点执行一次:0 0 9 1 * ?,因为我们无法确定每月1号是周几,所以只能用"?"代替。
这些只是些常用的字符,还有些特殊的字符我们并不需要去手写,我们可以通过在线生成器来生成cron表达式:
以下是一些Cron表达式的示例及其含义:
- 0 0 12 * * ?:每天中午12点执行一次。
- 0 15 10 ? * *:每天上午10点15分执行一次。
- 0 0/30 9-17 * * ?:每天上午9点到下午5点之间,每30分钟执行一次。
- 0 0 0 1 * ?:每月1号凌晨0点执行一次。
- 0 0 0 ? * Sun:每周日凌晨0点执行一次。
接下来我们通过一个案例来了解如何使用Spring Task。
入门案例
一、导入maven坐标spring-context(已存在)
因为Spring Task是一个非常小的框架,以至于其没有单独的jar包,其相关的api都封装在spring-context包下,而在原代码中已经导入了相关的maven坐标。
二、在启动类添加注解@EnableScheduling开启任务调度
三、自定义定时任务类