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