Задачи синхронизации SpringBoot и асинхронные операции
Ежедневная похвала, спасибо боссу.
Добро пожаловать на общедоступный номер: на самом деле это Овен. Галантерея продолжает обновляться......
1. Запланированные задачи
Всегда есть такой сценарий при ведении бизнеса: выполнить какую-то логику в определенное время. Фактически это прикладной сценарий задач на время, например, необходимо отправить пользователю сводку данных за предыдущий месяц в первый день каждого месяца.
1. Технология
Существует множество техник реализации задач на время
- Таймер: java.util.Timer, поставляемый с JDK, на самом деле больше похож на таймер, который может реализовывать отложенное выполнение и выполнение с определенной частотой или может указывать определенное время для выполнения, что используется реже.
- ScheduledExecutorService: также предоставляется JDK. Это класс задач по времени, разработанный на основе пулов потоков. Он выполняет определенные задачи в соответствии с количеством потоков при создании исполнителей (количество нескольких потоков означает, что каждому символу назначается поток)
- Spring Task: То есть сегодня будет представлен главный герой, который идет вместе со Spring.Конечно, здесь он используется через Springboot.
- Quartz: платформа планирования с открытым исходным кодом с более мощными функциями.
2. Использование аннотации
1) @EnableScheduling
Откройте задание на время, которое можно отметить в классе запуска или любом классе конфигурации (можно сканировать на объекте)
2) @Запланировано
Настройте определенные правила выполнения задач, которые можно пометить на методах классов, которые можно сканировать.Атрибуты:
- fixedRate: временной интервал между временем запуска предыдущей задачи и временем запуска следующей задачи (в миллисекундах).
- fixedDelay: временной интервал (в миллисекундах) между временем окончания предыдущей задачи и временем начала следующей задачи.
- InitialDelay: время (в миллисекундах) первого выполнения задержки выполнения
- cron: настроить время выполнения с помощью выражений cron
3. cron-выражения
Сценарии временных задач: отложенное выполнение, выполнение с определенной периодичностью, выполнение в заданное время
Выражение CRON здесь состоит в том, чтобы описать правила времени для выполнения задач. Cron состоит из 6-7 элементов, разделенных пробелами, которые представляют:
- С: от 0 до 59
- Оценка: 0~59
- Час: 0~23
- День: 1~31 (последний день определенного месяца также может быть 30)
- Месяц: 1~12
- Неделя: 1~7 (обратите внимание, что 1 — воскресенье)
- Год: 1970~2099
В дополнение к указанным выше цифровым элементам существует несколько специальных значений элементов:
- *: Указывает, что любое значение будет активировано, и оно может появиться в семи позициях элементов.Если оно появляется в минуте, это означает, что оно будет возвращаться и выполняться каждую минуту.
- ? : Аналогично *, но отображается только для дня и недели (только одна из этих двух позиций может быть осмысленным описанием, например: либо 3-е число каждого месяца, либо среда каждой недели каждого месяца), когда одна из них настроена со значимыми значениями, другой пишет?
- -: Указывает диапазон (до), который может появиться во всех семи позициях элемента.Например, если 1-7 появляется в минуте, это означает, что он выполняется каждую минуту с 1 минуты до 7 минут.
- /: Указывает, сколько времени требуется для выполнения с момента запуска, и он может появиться в любой из семи позиций элемента.Например, если 1/7 появляется в минуте, это означает, что он запускается один раз в минуту.1+ 7=8 минут.
- ,: Представляет значение перечисления, которое может встречаться во всех семи позициях элементов. Например, если в минуте появляются 1 и 7, это означает, что 1 минута и 7 минут выполняются по одному разу
- L: означает последний, он будет отображаться только в позициях дня и недели, день означает последний день, а неделя будет сопоставляться с такими числами, как 5L означает последний четверг
- W: указывает действительный рабочий день (с понедельника по пятницу), который будет отображаться только в дате с цифрами впереди, например, 5W: если 5-е число — суббота, время выполнения — пятница, то есть 4-е число; если 5-е число Воскресенье Тогда время выполнения следующий понедельник, то есть 6-е число; (то есть система порекомендует ближайший рабочий день к сегодняшнему дню, но учтите, что перекрестный поиск выполняться не будет: если это 31W и 31-е число является Воскресенье, он будет выполнен 29 числа)
- LW: используется вместе для обозначения последнего рабочего дня, появляется только в дате.
- #: (добавьте цифры до и после) указывает день недели, который будет появляться только в течение недели, например, 4#2 указывает на вторую среду (спереди указан день недели, а сзади — номер )
Поняв приведенные выше правила выражений, вы сможете писать выражения cron, соответствующие условиям.Рекомендуется разработать несколько сценариев для практики.
4. Однопоточное и многопоточное выполнение
Если задача A (fixedRate=2000) и задача B (fixedRate=3000) написаны и выполняются напрямую в соответствии с приведенной выше конфигурацией, возникнут следующие проблемы:
- Если время выполнения задачи A1 превышает 2 с, то задача A2, выполнение которой изначально планировалось через 2 с после начала задачи A1, не может быть выполнена вовремя.
- Задача A и задача B должны быть выполнены попеременно
Вышеупомянутые проблемы не могут позволить нашим задачам выполняться в соответствии с их соответствующими планами выполнения.В конечном итоге все задачи выполняются в одном потоке, поэтому асинхронное параллельное выполнение не может быть достигнуто, тогда это может быть достигнуто за счет многопоточности. параллельное выполнение между задачами
Здесь мы можем использовать аннотацию Spring @Async для достижения асинхронности.
2. Асинхронный
SpringBoot также поддерживает @Async для достижения асинхронности (добавление автоматической конфигурации можно использовать напрямую)
1. Аннотация
1) @enableasync.
Отмечены на классе загрузки или конфигурации класса, таблица открыта асинхронно
2) @асинхронный
Может быть помечен на классах (классы, которые могут быть просканированы контейнером Spring) или методах.
Аннотированные в классе методы в этом классе представлены как асинхронные.
2. Два возвращаемых значения асинхронных методов
-
Возвращаемое значение не требуется: void
-
Требуется возвращаемое значение:
@Async public Future<String> doTaskOne() throws Exception { return new AsyncResult<>("任务一完成"); }
3. Автоматическая настройка
Используя @Async для достижения асинхронности, нижний уровень по-прежнему реализуется с использованием многопоточности, так где же устанавливается или настраивается эта многопоточность или пул потоков? Мы все добавили в SpringBoot множество автоматических настроек.Мы можем найти класс TaskExecutionAutoConfiguration в пакете задач в пакете spring-boot-autoconfigure:
@Lazy
@Bean(name = { APPLICATION_TASK_EXECUTOR_BEAN_NAME,
AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME })
@ConditionalOnMissingBean(Executor.class)
//这个注解的意思:当在容器中没有发现Executor这个类则会加载这个bean,可以理解为此处为默认缺省对象
//返回的是一个spring为我们提供的线程池
public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
return builder.build();
}
Найдите TaskExecutorBuilder:
@Bean
@ConditionalOnMissingBean
public TaskExecutorBuilder taskExecutorBuilder() {
TaskExecutionProperties.Pool pool = this.properties.getPool();
TaskExecutorBuilder builder = new TaskExecutorBuilder();
builder = builder.queueCapacity(pool.getQueueCapacity());
builder = builder.corePoolSize(pool.getCoreSize());
builder = builder.maxPoolSize(pool.getMaxSize());
builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout());
builder = builder.keepAlive(pool.getKeepAlive());
builder = builder.threadNamePrefix(this.properties.getThreadNamePrefix());
builder = builder.customizers(this.taskExecutorCustomizers.orderedStream()::iterator);
builder = builder.taskDecorator(this.taskDecorator.getIfUnique());
return builder;
}
Свойства здесь загружаются в TaskExecutionProperties, параметры по умолчанию:
private int queueCapacity = Integer.MAX_VALUE;
private int coreSize = 8;
private int maxSize = Integer.MAX_VALUE;
private boolean allowCoreThreadTimeout = true;
В соответствии со следующим, вы также можете настроить конфигурацию из файла yml/properties.
@ConfigurationProperties("spring.task.execution")
В дополнение к вышеуказанным методам мы также можем определить наши собственные bean-компоненты для замены bean-компонентов по умолчанию.Согласно @ConditionalOnMissingBean(Executor.class), нам нужно только добавить в класс конфигурации:
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(核心线程数量);
executor.setMaxPoolSize(最大线程数量);
executor.setQueueCapacity(任务队列大小);
executor.initialize();
return executor;
}
3. Наконец
Согласно приведенному выше введению, для достижения асинхронных задач синхронизации можно расширить, добавив @Async к методу задачи для достижения
Нравится дорогая
Если вы считаете, что эта статья полезна для вас, вы можете "смотреть/переслать/лайкнуть/пометить", спасибо
Если вы найдете лучшие или отличные идеи, вы также можете обсудить их вместе в области сообщений.
Добро пожаловать на официальный аккаунт: галантерейные товары "На самом деле Овен" постоянно обновляются...