I.はじめに
定期的なタスクが生活の中でどこにでも反映、例えば、朝起き、あなたは自分自身を呼び出すための目覚まし時計、定期的なタスクを使用するプログラムで、シーンを設定する必要がありますか?注文が突然すぎて感じた、賃金に、1は、支払額を見ることができたときに、賃金へのプロセスを有するように生成された後、商品の在庫がで買ってきたので、私は、ただぶら下がって、順番に賃金をキャンセルしないしないでくださいロック状態、良い少量の、それは数十まだ買って、数千人のロック、そしてこの時、未払いの注文をキャンセルするタイミングを、この問題に良い解決策がある場合。
第二に、フレームワーク
1、春のタスク
SpringTask春は定期的なタスクのための軽量な自己開発したツールである、追加の依存関係を導入する必要はありません
2、クロン式
cronの式は文字列で、その構文は次のとおりです。秒の分の時間DAYOFMONTH月DAYOFWEEK
cronの形式の特殊文字は、次のとおりです。
文字 |
効果 | 例えば |
、(カンマ) | 列挙値は、列挙されました | 分ドメイン5、10、5時間の各トリガ点及び10点を表します。 |
- (ダッシュ) | トリガー範囲ことを示します | ドメイン分5-10では、1分に1回トリガされ、初めから10に5を表し、 |
*(アスタリスク) | 手段は、任意の値に一致します | 使用した分のドメインでは*毎分後にトリガを示しています |
/(左スラッシュ) | これは、開始トリガ時刻を示します また、各一定時間トリガ |
使用中の5/10分ドメインごとに一回5分からリア開始トリガ トリガーaに10分 |
?(疑問符) | そしてだけDAYOFMONTHで 任意の値に一致するDAYOFWEEK |
DAYOFMONTHドメインで?ショーは一日一回トリガされます |
#(井号) | DAYOFMONTHでのみ使用 これは、週の最初の数日間を表し、 |
DAYOFMONTHドメイン、毎月第3日曜日で使用する1#3 トリガーA |
L(大文字のL) | それは最後を表し | DAYOFWEEKドメインの使用5L、前木曜日のショートリガーで |
|
cronの構文の要素説明
時間要素 | 文字が表示される場合があります | 有効範囲 |
秒 | 、 - * / | 0-59 |
議事録 |
、 - * / | 0-59 |
営業時間 |
、 - * / | 0-59 |
DAYOFMONTH |
、 - * /?LW | 0-31 |
月 |
、 - * / | 1-12 |
DAYOFWEEK |
、 - * /?L番号 | 1-7 或 SUN-SAT |
三、业务场景
· 用户对某商品进行下单操作
· 系统需要根据用户购买的商品信息生成订单并锁定商品的库存
· 系统设定用户60分钟不支付,自动取消订单
· 开启一个定时任务,每隔10分钟进行一次扫描,如果有超时未支付订单,就将订单取消并释放库存商品
四、整合SpringTask
1、在config包下新建启动SpringTask启动类SpringTaskConfig
package com.zzb.test.admin.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; /** * 定时任务配置类 * Created by zzb on 2019/11/26 12:17 */ @Configuration @EnableScheduling public class SpringTaskConfig { }
2、在component包下新建SpringTask配置类OrderTimeOutCancelTask
package com.zzb.test.admin.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * 定时任务 订单超时自动取消并释放库存商品 * Created by zzb on 2019/11/26 11:07 */ @Component public class OrderTimeOutCancelTask { private static final Logger logger = LoggerFactory.getLogger(OrderTimeOutCancelTask.class); // TODO: 2019/11/26 Seconds Minutes Hours DayofMonth Month DayofWeek @Scheduled(cron = "0 0/10 * ? * ?") public void cancelTimeOutOrder(){ // TODO: 2019/11/26 从零点开始,每隔10分钟扫描一次,查询未支付订单 logger.info("取消订单,并释放库存商品"); } }
五、测试
启动项目,等待10分钟查看日志