1. Используйте функцию Расписание
Просто добавьте его в файл * Application.java SpringBoot.@EnableScheduling
Аннотируйте, чтобы использовать функцию расписания
@EnableScheduling
@SpringBootApplication
public class ScheduleApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduleApplication.class, args);
}
}
2. Создать сервис
Создайтеcom.example.schedule.service
пакет, затем создайтеTaskService
класс интерфейса
package com.example.schedule.service;
public interface TaskService {
void sayHello(String type);
}
Создать пакет реализации интерфейса службыcom.example.schedule.service.impl
, затем создайтеTaskService
класс реализацииTaskServiceImpl
package com.example.schedule.service.impl;
import com.example.schedule.service.TaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public class TaskServiceImpl implements TaskService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public void sayHello(String type) {
try {
long startTime = System.currentTimeMillis() / 1000;
logger.info(type + " => " + startTime + " - 任务开始");
logger.info(type + " => " + "任务执行中");
Thread.sleep(500);
long endTime = System.currentTimeMillis() / 1000;
logger.info(type + " => " + endTime + " - 任务结束");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. Введите тему
Создать пакет задачcom.example.schedule.job
, а затем создайте основной класс реализации задачи на время в пакетеScheduleJob
package com.example.schedule.job;
import com.example.schedule.service.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduleJob {
@Autowired
private TaskService taskService;
....定时任务实现
}
использовать@Scheduled
Для задач на время необходимо соблюдать следующие правила:
- Возвращаемое значение этого метода должно быть
void
- Параметр этого метода должен быть пустым
3.1. Используйте fixedDelay для планирования задач
@Scheduled(fixedDelay = 2000)
public void fixedRateTask() {
taskService.sayHello("fixedDelay");
}
использоватьfixedDelay
Когда запланированная задача реализована, период между «концом последней задачи» и «началом следующей задачи» будет длиться фиксированные 2000 миллисекунд или 2 секунды.
Задачи всегда будут ждать две секунды после начала выполнения предыдущей задачи.
помимо использованияfixedDelay
можно также использовать в дополнение кfixedDelayString
Реализуйте ту же функцию, что и выше.
@Scheduled(fixedDelayString = "2000")
public void fixedDelayStringTask() {
taskService.sayHello("fixedDelayString");
}
3.2. Используйте fixedRate для планирования задач
@Scheduled(fixedRate = 2000)
public void fixedRateTask() {
taskService.sayHello("fixedRate");
}
При использовании fixedRate для реализации задачи по времени период между «началом последней задачи» и «началом следующей задачи» будет длиться фиксированные 2000 миллисекунд или 2 секунды.
Старт задачи не дожидается окончания предыдущей задачи, а запускает следующую задачу через 2 секунды после запуска задачи.
такой жеfixedDelay
Такой жеfixedRate
также можно использоватьfixedRateString
способ достижения.
@Scheduled(fixedRateString = "2000")
public void fixedRateStringTask() {
taskService.sayHello("fixedRateString");
}
3.3. Использование с initialDelay
@Scheduled(initialDelay = 1000, fixedDelay = 2000)
public void fixedDelayWithInitialDelayTask() {
taskService.sayHello("fixedDelayWithInitialDelayTask");
}
Когда задано запланированное заданиеinitialDelay
, задача не будет выполняться сразу после загрузки, она будет ждатьinitialDelay
значение после первого выполнения, то оно будет продолжаться в соответствии сfixedDelay
Исполнение по времени.
Конечно, вы также можетеfixedDelay
заменитьfixedRate
, тоже будем ждатьinitialDelay
значение начинается после первого выполнения, хотя оно будет продолжаться в соответствии с fixedRate
Исполнение по времени. Но не одновременноfixedDelay
иfixedRate
, который будет сообщатьorg.springframework.beans.factory.BeanCreationException
Ошибка.
3.4. Используйте cron для планирования задач
По сравнению с фиксированными методами выполнения fixedDelay и fixedRate, метод выражения cron может более гибко управлять выполнением задач.
@Scheduled(cron = "*/5 * * * * *")
public void cronTask() {
taskService.sayHello("cron");
}
Каштан эквивалентен@Scheduled(fixedDelay = 5000)
То есть подождите 5 секунд после завершения выполнения последней задачи, прежде чем выполнять ее.
Выражения Cron имеют специальные грамматики. Вот наиболее часто используемые грамматики для справки. Для сложных грамматик используйтегенератор выражений cronСгенерируйте или изучите синтаксис кукурузы.
cron имеет в общей сложности 7 цифр, но последняя цифра — это год, который можно оставить пустым, поэтому мы можем записать 6 цифр:
- Первая цифра, обозначающая секунды, значение 0-59
- Вторая цифра, обозначающая баллы, принимает значение 0-59.
- Третья цифра, обозначающая час, принимает значение 0-23.
- Четвертая цифра, дата день/день, значение 1-31
- Пятая цифра, число месяц, значение 1-12
- Шестая цифра, неделя, принимает значение 1-7, понедельник, вторник..., Примечание: не первая неделя, вторая неделя Дополнительно: 1 означает воскресенье, 2 означает понедельник.
- Седьмая цифра, год, может быть оставлена пустой, значение 1970-2099.
В cron также есть специальные символы со следующими значениями:
● (*) звездочка: может означать каждую, каждую секунду, каждую минуту, каждый день, каждый месяц, каждый год...
● (?) Вопросительный знак: вопросительный знак может появляться только в двух позициях даты и недели, указывая на то, что значение этой позиции является неопределенным и выполняется в 3 часа каждый день, поэтому шестая позиция недели, нам не нужно обращать внимание, это неопределенное значение . Также: дата и неделя — это два взаимоисключающих элемента, обозначенных вопросительным знаком, чтобы указать, что значение не указано. Например, 10 января — это понедельник 1. Если позиция недели — это другой вторник, это непоследовательно.
● (-) знак минус: выразить диапазон, например, используя «10-12» в поле часа, это означает от 10 до 12 часов, то есть 10,11,12
● (,) запятая: выражает значение списка, например, используя «1,2,4» в поле недели, это означает понедельник, вторник, четверг
● (/) косая черта: например: x/y, x — начальное значение, y — размер шага, например, в первой цифре (секунде) 0/15, начиная с 0 секунд, каждые 15 секунд и, наконец, 0, 15 , 30, 45, 60 Другое: */y, эквивалентно 0/y
Вот несколько примеров для проверки:
- 0 0 3 * * ?Выполняется в 3 часа каждый день
- 0 5 3 * * ?Выполняется в 3:5 каждый день
- 0 5 3 ? * * Выполняется в 3:5 каждый день, как указано выше
- 0 5/10 3 * * ?Выполняется в 5 минут, 15 минут, 25 минут, 35 минут, 45 минут и 55 минут в 3:00 каждый день
- 0 10 3 ?* 1 Каждое воскресенье, выполнять в 3:10, Примечание: 1 означает воскресенье
- 0 10 3 ? * 1 #3 Третья неделя каждого месяца, выполняется в воскресенье, # может стоять только в позиции недели
4. Резюме
- Свойство fixedDelay гарантирует наличие фиксированного интервала времени между временем окончания задачи и временем начала следующей задачи.
- Свойство fixedRate запускает задачу каждые n миллисекунд. > Используйте свойство fixedDelay, когда вам нужно убедиться, что запущен только один экземпляр задачи; используйте свойство fixedRate, когда задачи выполняются независимо.