Резюме
В этой статье в основном объясняется процесс интеграции SpringTask в торговый центр на примере пакетной модификации сверхурочных заказов. SpringTask — это облегченный инструмент для выполнения задач синхронизации, независимо разработанный Spring, который проще и удобнее, чем Quartz, и может использоваться без введения других зависимостей. Выражение Cron представляет собой строку, включающую 6-7 элементов времени, которые можно использовать для указания времени выполнения задачи в 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 или вс-сб |
Описание специальных символов в формате Cron
| персонаж | эффект | Пример |
|---|---|---|
| , | Список значений перечисления | Используйте 5, 10 в поле «Минуты», что означает, что он срабатывает один раз в 5 минут и 10 минут каждый. |
| - | Указывает диапазон срабатывания | Используйте 5-10 в поле «Минуты», чтобы запускать каждую минуту от 5 до 10 минут. |
| * | соответствует любому значению | Используйте * в поле «Минуты», чтобы указать, что он будет запускаться каждую минуту. |
| / | Время начала начинает срабатывать, и срабатывает каждое фиксированное время | Используйте 5/10 в поле «Минуты», что означает, что он срабатывает каждые 5 минут и каждые 10 минут. |
| ? | В DayofMonth и DayofWeek для сопоставления произвольных значений | Используйте ? в поле DayofMonth, чтобы указать, что он запускается один раз в день. |
| # | В DayofMonth определите день недели | 1#3 означает третье воскресенье |
| L | значит последний | Используйте 5L в DayofWeek для срабатывания в последний четверг |
| W | Указывает допустимые рабочие дни (с понедельника по пятницу) | Используйте 5W в DayofMonth, если 5-е число — суббота, оно сработает один раз 4-го числа ближайшего рабочего дня. |
Описание бизнес-сценариев
- Пользователь размещает заказ на товар;
- Системе необходимо сформировать заказ и заблокировать инвентарь продукта в соответствии с информацией о продукте, купленной пользователем;
- Система установила, что заказ будет отменен, если пользователь не заплатит в течение 60 минут;
- Запустите задание на время, проверяйте каждые 10 минут, если есть заказ, который не был оплачен с течением времени, отмените заказ и отмените заблокированный товарный запас.
Интеграция SpringTask
Поскольку SpringTask уже существует в среде Spring, добавлять зависимости не нужно.
Добавить конфигурацию SpringTask
Вам нужно только добавить аннотацию @EnableScheduling к классу конфигурации, чтобы включить возможности запланированных задач SpringTask.
package com.macro.mall.tiny.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 定时任务配置
* Created by macro on 2019/4/8.
*/
@Configuration
@EnableScheduling
public class SpringTaskConfig {
}
Добавьте OrderTimeOutCancelTask для выполнения задач по времени
package com.macro.mall.tiny.component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* Created by macro on 2018/8/24.
* 订单超时取消并解锁库存的定时器
*/
@Component
public class OrderTimeOutCancelTask {
private Logger LOGGER = LoggerFactory.getLogger(OrderTimeOutCancelTask.class);
/**
* cron表达式:Seconds Minutes Hours DayofMonth Month DayofWeek [Year]
* 每10分钟扫描一次,扫描设定超时时间之前下的订单,如果没支付则取消该订单
*/
@Scheduled(cron = "0 0/10 * ? * ?")
private void cancelTimeOutOrder() {
// TODO: 2019/5/3 此处应调用取消订单的方法,具体查看mall项目源码
LOGGER.info("取消订单,并根据sku编号释放锁定库存");
}
}
Адрес исходного кода проекта
публика
Полный набор обучающих руководств для проекта торгового центра сериализуется.Обратите внимание на общедоступный номерПолучите это прямо сейчас.