Весной В загрузочном приложении функцию регулярного выполнения запланированных задач можно реализовать с помощью таймера. Весна Bootпредоставил@Scheduled
Аннотации для упрощения написания таймеров,Выражение Cron — это своего рода выражение в определенный момент времени. Универсальный способ сказать задачу. В этой статье объясняется, как Весной Динамические выражения Cron используются в загрузочных приложениях для выполнения задач таймера.
Выражение Cron — это выражение времени, состоящее из 6 полей, представляющих секунды, минуты, часы, дни, месяцы и дни недели. Каждое поле разделено пробелами. Его формат следующий:
<Второй> <точка> <час> <день> <луна> <День недели>
В этом формате каждое поле может содержать специальные символы и символы, как показано в следующей таблице:
символ | описывать |
---|---|
| Соответствовать всем значениям этого поля |
| Не указывайте никаких значений в этом поле |
| Укажите диапазон, например 1-5 означает от 1 до 5. |
| Перечислите несколько значений, например 1,3,5 означает 1, 3 или 5. |
| Укажите размер шага приращения, например 1/3 означает начало с 1 и увеличение каждые 3. |
| Укажите последнее значение в этом поле,как в день недели |
| Укажите в этом поле ближайший к указанной дате рабочий день, как указано в поле дня. |
Например, выражение Cron 0 0/5 * * * ?
Указывает, что задача будет выполняться каждые 5 минут.
Весной Загрузочное приложение,Может использоваться с@Scheduled
注解метод来创建定час器。这个方法会按照预定изчас间调用,и выполнять соответствующие задачи. Вот простой пример:
@Component
public class MyTask {
@Scheduled(cron = "0 0/5 * * * ?")
public void run() {
// выполнять задачи
}
}
В приведенном выше примере,Мы определяем файл с именемMyTask
компоненты,Он содержит файл с именемrun()
метод,Этот метод использует@Scheduled(cron = "0 0/5 * * * ?")
аннотация для указания каждого5точка钟执行一次任务。
Однако,в практическом применении,Иногда необходимо установить выражения cron на основе файлов конфигурации или других динамических условий. в этом случае,@Scheduled
Аннотированная статическая строка не может удовлетворить потребности。Чтобы решить эту проблему,мы можем использоватьCronSequenceGenerator
класс для динамического созданияCronвыражение。Ниже приведен конкретный метод реализации.。
первый,Мы создаем файл с именемDynamicCronJob
компоненты,Он содержит два свойства:cronExpression
иtask
。cronExpression
Атрибут используется для хранения текущегоCronвыражение,иtask
Свойство — это реализацияRunnable
Объект задачи интерфейса。
@Component
public class DynamicCronJob {
private String cronExpression;
private Runnable task;
// Опустить методы получения и установки
}
затем,Мы создаем файл с именемDynamicScheduler
компоненты,он содержитScheduledExecutorService
свойство,用于定часвыполнять задачи。существоватьDynamicScheduler
в компоненте,мы используемCronSequenceGenerator
класс для динамического созданияCronвыражение,и поручить задачуScheduledExecutorService
Расписание。
@Component
public class DynamicScheduler {
@Autowired
private ScheduledExecutorService scheduledExecutorService;
public void schedule(DynamicCronJob job) {
CronSequenceGenerator generator = new CronSequenceGenerator(job.getCronExpression());
ScheduledFuture<?> future = scheduledExecutorService.schedule(() -> {
job.getTask().run();
}, triggerContext -> {
Date nextExec = generator.next(triggerContext.lastActualExecutionTime());
return nextExec;
});
}
}
В приведенном выше примере,мы используемscheduledExecutorService
изschedule()
方法来安排定час任务。в,мы используемLambdaвыражение来指定任务из具体实现。triggerContext
表示上一次任务已经执行изчас间,На основе этого времени мы можем рассчитать время выполнения следующей задачи. Конкретно,Мы делаем это, вызываяCronSequenceGenerator
изnext()
方法来计算下一次任务执行изчас间,然后将这个час间返回给ScheduledFuture
。
Наконец-то мы Весной Загрузочное приложениеиспользоватьDynamicScheduler
Компоненты для динамического планирования задач。下面是一个简单из例子:
@SpringBootApplication
public class Application implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private DynamicScheduler scheduler;
@Override
public void run(String... args) throws Exception {
DynamicCronJob job = new DynamicCronJob();
job.setCronExpression("0 0/5 * * * ?");
job.setTask(() -> {
// выполнять задачи
});
scheduler.schedule(job);
}
}
В приведенном выше примере,наспервыйпроходитьCommandLineRunner
интерфейс для определения задачи,в этой задаче,нас创建了一个名为job
изDynamicCronJob
объект,И настроить конкретную реализацию выражений и задач Cron. Затем,нас将job
объект交给DynamicScheduler
компоненты Расписание。
В этой статье объясняется, как Весной Динамические выражения Cron используются в загрузочных приложениях для выполнения задач таймера.проходитьиспользоватьDynamicCronJob
иDynamicScheduler
компоненты,Мы можем устанавливать выражения Cron на основе файлов конфигурации или других динамических условий.,И динамически планируйте задачи по таймеру. Этот подход может сделать программы более гибкими и масштабируемыми.,Это также облегчает отладку и обслуживание.