Обмен технологиями

SpringBoot daily: реализация @Scheduled выполняется один раз при запуске службы.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Говоря о запланированных задачах, нам следует подумать о @Scheduled, Quartz и XXL-JOB. Однако некоторые отдельные сервисы или небольшие проекты могут напрямую использовать @Scheduled для реализации асинхронных задач для удобства и скорости. Таким образом, требования к теме данной статьи расширены.

Когда в проекте используется @Scheduled, как указанную асинхронную задачу можно выполнить заранее при запуске проекта?

1. Подробное объяснение @Scheduled

Аннотация @Scheduled поддерживает несколько параметров для гибкого управления временем выполнения задачи.

  • cron: выражение Cron, которое может точно контролировать секунды, минуты, часы, дни, месяцы, недели и т. д.
    Вставьте сюда описание изображения
  • Zone: Получите часовой пояс, например Азия/Шанхай, часовой пояс, который мы обычно используем. Обычно мы оставляем это поле пустым.
  • фиксированная задержка: через какое время после последнего завершения выполнения он будет выполнен снова. Например, @Scheduled(fixedDelay = 5000)
  • фиксированнаяDelayString: имеет то же значение, что и фиксированнаяDelay, но в виде строки. Единственное отличие состоит в том, что он поддерживает заполнители, такие как @Scheduled(fixedDelayString = "5000").
  • fixRate: сколько времени прошло после последнего запуска времени выполнения, например @Scheduled(fixedRate = 5000)
  • fixRateString: имеет то же значение, что и fixRate, но в виде строки. Единственное отличие состоит в том, что поддерживаются заполнители.
  • InitialDelay: как долго задерживать выполнение в первый раз. Например, первая задержка составляет 1 секунду перед выполнением. После этого он будет выполняться каждые 5 секунд в соответствии с правилом fixRate. )
  • InitialDelayString: имеет то же значение, что и InitialDelayString, но в виде строки. Единственное отличие состоит в том, что поддерживаются заполнители.

2. Логическая реализация

1. Создайте логический метод запланированной задачи.

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Создайте новый класс выполнения запуска.

Этот класс в основном вызывает указанный метод задачи вручную при запуске.

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Примечание. Не забудьте добавить @EnableScheduling в класс запуска, чтобы запланированная задача выполнялась. Конечно, это не влияет на логический тест в этой статье.

3. Результаты испытаний

После запуска службы просмотрите информацию о печати.
Вставьте сюда описание изображения