Настройка и использование задач синхронизации Spring Task

Spring Boot задняя часть сервер Spring

Spring Task

записыватьSpringВстроенное использование задач по времени.

Использование временных задач весной

Использование временных задач на основе файлов конфигурации xml

Сначала настройте spring, чтобы открыть запланированную задачу

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:p="http://www.springframework.org/schema/p"  
    xmlns:task="http://www.springframework.org/schema/task"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:aop="http://www.springframework.org/schema/aop"   
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd    
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd    
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd    
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd    
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">  
  
    <task:annotation-driven /> <!-- 定时器开关-->  
  
    <bean id="myTask" class="com.spring.task.MyTask"></bean>  
  
    <task:scheduled-tasks>  
        <!-- 这里表示的是每隔五秒执行一次 -->  
        <task:scheduled ref="myTask" method="show" cron="*/5 * * * * ?" />  
        <task:scheduled ref="myTask" method="print" cron="*/10 * * * * ?"/>  
    </task:scheduled-tasks>  
      
    <!-- 自动扫描的包名 -->
    <context:component-scan base-package="com.spring.task" />  
      
</beans>  

Определите собственную логику выполнения задачи

package com.spring.task;  
  
/** 
 * 定义任务 
 */  
public class MyTask {  
      
    public void show() {  
        System.out.println("show method 1");  
    }  
      
    public void print() {  
        System.out.println("print method 1");  
    }  
} 

Использование временных задач на основе аннотаций

package com.spring.task;  
import org.springframework.scheduling.annotation.Scheduled;  
import org.springframework.stereotype.Component;  
  
/**
 * 基于注解的定时器  
 */
@Component
public class MyTask2 {  

    /**
     * 定时计算。每天凌晨 01:00 执行一次
     */
    @Scheduled(cron = "0 0 1 * * *")
    public void show() {
        System.out.println("show method 2");  
    }  
      
    /**
     * 启动时执行一次,之后每隔2秒执行一次  
     */
    @Scheduled(fixedRate = 1000*2)   
    public void print() {  
        System.out.println("print method 2");
    }
}

Таким образом, при запуске проекта запланированная задача будет выполняться вовремя в соответствии с правилами.

Использование запланированных задач в Spring Boot

Удобнее использовать в Spring Boot.

  • представлятьspringboot starterСумка
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
</dependency>
  • Добавьте в класс запуска программы запись@EnableScheduling, включите функцию запланированного задания
@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
  • Определить логику задачи синхронизации
@Component
public class MyTask3 {

    private int count=0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process() {
        System.out.println("this is scheduler task runing  "+(count++));
    }
}

Описание правил выполнения задачи

Первый взгляд@ScheduledАннотированный исходный код

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {

	String cron() default "";

	String zone() default "";

	long fixedDelay() default -1;

	String fixedDelayString() default "";

	long fixedRate() default -1;

	String fixedRateString() default "";

	long initialDelay() default -1;

	String initialDelayString() default "";
}

Видно, что в аннотации можно передать 8 параметров:

  • cron: укажите выражение cron
  • zone: По умолчанию используется часовой пояс сервера по умолчанию. можно установить наjava.util.TimeZoneидентификатор зоны в
  • fixedDelay: интервал от завершения предыдущей задачи до начала следующей задачи в миллисекундах.
  • fixedDelayString: То же, что и выше, значение времени равноStringТипы
  • fixedRate: интервал от начала предыдущей задачи до начала следующей задачи в миллисекундах.
  • fixedRateString: То же, что и выше, значение времени равноStringТипы
  • InitialDelay: время задержки для первого выполнения задачи в миллисекундах.
  • initialDelayString: то же, что и выше, значение времени равноStringТипы

Как использовать cron-выражения

Выражение Cron представляет собой строку. Строка разделена 5 или 6 пробелами и разделена на 6 или 7 полей. Каждое поле представляет значение. Cron имеет следующие два синтаксических формата:

  • Seconds Minutes Hours DayofMonth Month DayofWeek Year
  • Seconds Minutes Hours DayofMonth Month DayofWeek

В каждом поле могут появляться следующие символы:

  • Секунды: могут отображаться четыре символа ", - * /", допустимый диапазон — целое число от 0 до 59.
  • Минуты: могут отображаться четыре символа ", - * /", допустимый диапазон — целое число от 0 до 59.
  • Часы: могут отображаться четыре символа ", - * /", допустимый диапазон — целое число от 0 до 23.
  • DayofMonth: могут отображаться восемь символов ", - * / ? L W C", допустимый диапазон — целое число от 0 до 31.
  • Месяц: могут отображаться четыре символа ", - * /", допустимый диапазон — целое число от 1 до 12 или от января до декабря.
  • DayofWeek: могут отображаться четыре символа ", - * / ? L C #", допустимый диапазон — целое число от 1 до 7 или два диапазона SUN-SAT. 1 для воскресенья, 2 для понедельника и так далее
  • Год: могут отображаться четыре символа «, - * /», допустимый диапазон: 1970–2099.

В каждом поле используются числа, но также могут появляться следующие специальные символы, их значения:

  1. *: указывает любое значение, которое соответствует этому полю.Если вы используете * в поле Минуты, это означает, что событие будет запускаться каждую минуту.
  2. ?: Может использоваться только в доменах DayofMonth и DayofWeek. Он также соответствует произвольным значениям домена, но на самом деле это не так. Потому что DayofMonth и DayofWeek будут влиять друг на друга. Например, если вы хотите инициировать планирование 20-го числа каждого месяца, независимо от того, какой день недели будет 20-го числа, вы можете использовать только следующий метод записи: 13 13 15 20 * ?, где последняя цифра может быть только использовал? , и не может использовать *, если вы используете *, чтобы указать, что он будет запускаться независимо от дня недели, что не так.
  3. -: Указывает диапазон, например, в поле Минуты используется 5-20, что означает, что он срабатывает каждую минуту от 5 до 20 минут.
  4. /: указывает, что триггер запускается в начальное время, а затем срабатывает через фиксированное время. Например, если в поле «Минуты» используется 5/20, это означает, что он срабатывает каждые 5 минут, а также каждые 25, 45 и т. д. , соответственно.
  5. ,: Указывает, что перечислены значения перечисления. Например: используйте 5,20 в поле «Минуты», это означает, что стрелять каждую минуту в 5 и 20 минут.
  6. L: Указывает последний, который может отображаться только в полях DayofWeek и DayofMonth.Если в поле DayofWeek используется 5L, это означает, что он срабатывает в последний четверг.
  7. W: указывает допустимый рабочий день (с понедельника по пятницу), который может отображаться только в поле DayofMonth.Система инициирует событие в допустимый рабочий день, ближайший к указанной дате. Например: используйте 5W в DayofMonth, если 5-е число — суббота, оно сработает в ближайший день недели: пятницу, то есть 4-е число. Если 5-е число приходится на воскресенье, оно сработает 6-го (понедельник); если 5-е число приходится на период с понедельника по пятницу, оно сработает 5-го числа. Еще один момент: последние поиски W не охватывают месяцы.
  8. LW: Эти два символа могут использоваться вместе для обозначения последнего рабочего дня месяца, то есть последней пятницы.
  9. #: Используется для определения дня недели в каждом месяце. Может отображаться только в поле DayofMonth. Например, в 4#2 это означает вторую среду месяца.

Ссылаться например выражения cron