фон
Во время разработки проекта нам часто нужно выполнять периодические задачи. Это может помочь нам добиться этого хорошо с помощью задач времени.
Давайте сравним несколько часто используемых временных рамках задач:
Как видно из приведенной выше таблицы, структура расписания пружины имеет полные функции и прост и прост в использовании. Весенний график полностью квалифицирован для малых и средних проектов.
1. График интеграции Springboot
1.1 Добавление пакета зависимости Maven
Поскольку весенний график включен в основной модуль Spring-Boot-Starter, никаких дополнительных зависимостей не требуется.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </Зависимость> </зависимости>
1.2 Start Class, добавьте Annotation Startup Annotation
Добавление аннотации @enablescheduling к классу входа или конфигурации Springboot может включить задачи времени.
@EnablesCeduling@SpringBootApplicationPublic Class PredicaleApplicalation {public static void main (string [] args) {springApplication.run (swareupeplication.class, args);}}1.3. Добавить временные задачи
Мы приведем примеры трех планировщиков весеннего расписания.
1.3.1 выражения крона
Подобно правилам определения времени выражения Cron в рамках Linux. Выражение Cron состоит из 6 или 7 мест, разделенных полями времени, как показано на рисунке ниже:
Общие выражения:
Возьмите каштан:
Добавьте метод работы (), который выполняется каждые 10 секунд.
ПРИМЕЧАНИЕ. Когда время выполнения метода превышает частоту планирования задач, планировщик будет выполняться в следующем цикле.
Например: предполагая, что метод работы () начинает выполняться на 0 -й секунде, и метод выполняется в течение 12 секунд, то в следующий раз, когда метод работы () будет выполнен 20 -й секундой.
@Componentpublic class mytask {@scheduled (cron = "0/10 * * * * *") public void work () {// Логика выполнения задачи}}}}1.3.2 Фиксированные интервальные задачи
Следующее время выполнения задачи рассчитывается по времени окончания последнего выполнения задачи метода. И начало периодического выполнения задач с этим правилом.
Возьмите каштан:
Добавьте метод работы () и выполняйте его каждые 10 секунд.
Например: предположим, что метод работы () начинает выполняться на 0 -й секунде, и метод выполняется в течение 12 секунд, тогда в следующий раз, когда метод работы () выполняется 22 -й секундой.
@Scheduled (fixedDelay = 1000*10) public void work () {// Логика выполнения задачи}1.3.3 Задачи с фиксированной частотой
Выполнять задачи на указанной частоте и начало периодического выполнения планирования с этим правилом.
Возьмите каштан:
Добавьте метод работы (), который выполняется каждые 10 секунд.
Примечание. Когда время выполнения метода превышает частоту планирования задач, планировщик выполнит следующую задачу сразу после выполнения текущего метода.
Например: предположим, что метод работы () начинает выполняться на 0 -й секунде, и метод выполняется в течение 12 секунд, тогда в следующий раз, когда метод работы () выполняется 12 -я секунда.
@Scheduled (FixedRate = 1000*10) public void work () {// Логика выполнения задачи}2. Настройте пул потоков Taskscheduler
В реальных проектах наша система может определить несколько задач времени. Затем можно выполнить несколько задач по времени и параллельно.
Глядя на org.springframework.scheduling.config.scheduledtaskretrarer исходный код, обнаруживается, что Spring по умолчанию создаст однопоточный пул. Это может быть фатальным для нашей многозадачности. Когда несколько задач выполняются одновременно (или необходимо выполнять одновременно), планировщик задач будет испытывать время, и время выполнения задачи будет неопределенным.
Protected void pradeLetasks () {if (this.taskscheduler == null) {this.localexeCutor = executors.newsingleThreadSchedExeCutor (); this.taskscheduler = new concurrenttaskscheduler (this.localexecutor);} // Опустить ...}2.1 Пользовательский пул потоков
Добавлен класс конфигурации для реализации интерфейса SchedulingConfigurer. Перепишите метод ConfigureTasks и установите пользовательский пул потоков через TaskRegistrar.
@ConfigurationPublic Class PreduleConfig реализует PradulingConfigurer {@OverridePublic void ConfigureTasks (PreduledTaskerRar TaskRegistrar) {taskRegistrar.setscheduler (taskexeCutor ());}@bean (destressmethod = "uplowder") public exector taskectececececececececececececececececect (}@bean (destroymethod = ") Executors.newscheduledthreadpool (20);}}3. Проблемы в практических приложениях
3.1 Проблемы запуска и выключения в веб -приложениях
Мы знаем, что бобы, загруженные или инициализированные в течение пружины, будут автоматически разгружены (уничтожены), когда служба остановлен. Однако, поскольку потоки имеют уровень JVM, если пользователь запускает поток в веб-приложении, жизненный цикл этого потока не будет соответствовать веб-приложению. То есть даже если веб -приложение остановится, поток все еще не заканчивается (смерть).
Решение:
1) Текущий объект инициализируется до пружины
Когда пружина удаляет (разрушает) экземпляр, будет вызван метод уничтожения экземпляра. Реализовано путем реализации метода уничтожения интерфейса OndableBean interface. Активно закрыть нить в методе уничтожения.
@Componentpublic class mytask реализует issosablebean {@overridepublic void destress () throws exception {// закройте поток или пул потока Threadpooltaskscheduler scheduler = (threadpooltaskscheduler) ApplicationContext.getBean ("scheduler"); scheduler.shutdown ();2) Текущий объект не инициализируется (управляется) до пружины
Затем мы можем добавить слушателя для контекста сервлета, чтобы активно закрыть поток, когда служба сервлета остановлен.
Общедоступный класс MyTaskListenter реализует ServletContextLister {@OverridePublic void contextDestroyed (ServletContexTexTent arg0) {// Закройте потоки или пул потоков} // Опустить ...}3.2 Вопросы распределенного развертывания
В реальных проектах наша система обычно развернута в кластерах, распределенном или аварийном восстановлении. Затем задачи времени могут иметь проблемы с параллелизмом, то есть одновременно выполняется на нескольких серверах одновременно.
Решение (распределенная блокировка):
1) Заблокировать таблицу базы данных
2) Кэш промежуточный программное обеспечение
3) Реализовано через Zookeeper
Суммировать:
Весеннее расписание предоставляет нам простую, быстрое, эффективное и стабильное время задачи времени. Тем не менее, необходимо рассмотреть жизненный цикл потоков и распределенных вопросов развертывания.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.