1. Запланированные задачи, реализованные с помощью аннотации @Scheduled.
Чтобы реализовать запланированную задачу, сначала включите поддержку запланированных задач, добавив аннотацию @EnableScheduling в класс конфигурации, а затем аннотируйте @Scheduled для метода выполнения запланированной задачи, объявив, что это запланированная задача.
В классе записи Spring Boot XXXApplication должна быть аннотация @SpringBootApplication, которая используется для обозначения записи проекта и выполнения некоторой базовой автоматической настройки. Таким образом, проекты Spring Boot могут аннотировать @EnableScheduling в классе запуска.
Класс конфигурации:
Класс выполнения запланированной задачи:
В аннотации «Запланировано» есть следующие параметры:
1.cron — это выражение для настройки запланированного выполнения, например 0 0/5 * * *? Выполнять каждые пять минут, секунд, минут, часов, дни и месяцы. Выражение cron поддерживает использование заполнителей.
2.zone представляет часовой пояс времени выполнения.
3.fixedDelay и fixedDelayString представляют фиксированное время задержки выполнения, на какое время следует задерживать выполнение после завершения последней задачи.
4.fixedRate и fixRateString представляет собой выполнение с фиксированной частотой. Сколько времени потребовалось для начала выполнения после запуска последней задачи?
5. InitialDelay и InitialDelayString представляют начальное время задержки, время задержки перед первым вызовом.
Если одновременно определено несколько запланированных задач, они будут выполняться в соответствии с порядком, в котором программа загружает методы с пометкой @Scheduled. Если запланированная задача не может быть выполнена и завершена, время выполнения следующей задачи не может быть установлено, что приведет к тому, что все запланированные задачи, следующие за этой задачей, не смогут продолжать выполнение, и все запланированные задачи объявят забастовку. Поэтому при применении запланированных задач SpringBoot необходимо избегать таких явлений, как «бесконечные циклы», «выполнение занимает много времени» и «http продолжает ждать ответа без ответа», в противном случае запланированные задачи будут напрямую срабатывать. Для сценариев с особенно большими объемами данных, запросов или удаленных вызовов рекомендуется обрабатывать запланированные задачи по сегментам.
Преимущества:
Нет необходимости полагаться на внешние фреймворки.
Выполняйте задания быстро и легко. @EnableScheduling, аннотации @Scheduled
Недостатки:
Не умеет управлять задачами. Чтобы остановить задачу, ее необходимо опубликовать повторно.
Динамическая настройка не поддерживается. Изменение параметров задачи требует перезапуска проекта.
Развертывание кластера не поддерживается. В режиме кластера задачи можно планировать и выполнять несколько раз, поскольку информация о задачах не передается между узлами кластера, и задачи на каждом узле будут выполняться вовремя.
单体,即一个项目部署在一台服务器上;
集群,即将单体复制多份部署在多台服务器,其中每个单体被称为一个节点。
2. Запланированные задачи, реализованные с помощью xxl-job
1. Использование xxl-job
1. Введение
XXL-JOB — это легкая платформа распределенного планирования задач, основными целями разработки которой являются быстрая разработка, простота обучения, легкость и простота расширения. Исходный код теперь открыт и подключен к онлайн-линейкам продуктов многих компаний и готов к использованию «из коробки».
Разархивируйте исходный код, импортируйте исходный код в IDE в соответствии с форматом maven и используйте maven для компиляции. Структура исходного кода следующая:
xxl-job-admin: диспетчерский центр
xxl-job-core: публичная зависимость
xxl- job-executor-samples: образец исполнителя (выберите подходящую версию исполнителя, которую можно использовать напрямую или сослаться на нее и преобразовать существующий проект в исполнителя) xxl-job-executor-sample-springboot: версия
Springboot , управлять исполнителем через Springboot, рекомендуется этот метод;
xxl-job-executor-sample-spring: версия Spring, которая управляет исполнителем через контейнер Spring, который является более общим;
xxl-job-executor-sample-frameless: безрамочный версия;
В xxl-job есть две роли:
центр планирования xxl-job-admin: унифицированное управление задачами планирования на платформе планирования задач, ответственное за запуск выполнения планирования и предоставление платформы управления задачами.
xxl-job-executor исполнитель: исполнителем обычно является наша бизнес-система, например проект Springboot в примере.
Идея дизайна:
поведение планирования абстрагировано на общедоступной платформе «центра планирования». Сама платформа не несет бизнес-логики, а «центр планирования» отвечает за инициацию запросов планирования.
Задачи абстрагируются в разрозненные JobHandlers и передаются «исполнителю» для единого управления. «Исполнитель» отвечает за получение запросов планирования и выполнение соответствующей бизнес-логики в JobHandler. Таким образом, части «планирования» и «задачи» можно отделить друг от друга, чтобы улучшить общую стабильность и масштабируемость системы.
xxl-job — это централизованная система управления. Система в основном управляет различной информацией о запланированных задачах через MySQL. Когда наступает время запуска запланированной задачи, информация о задаче извлекается из базы данных в память, и запрос на планирование инициируется в исполнитель задач.
2. Используйте
①Загрузить исходный код: https://github.com/xuxueli/xxl-job/
②Инициализация «базы данных планирования»:
перейдите на официальный сайт, чтобы загрузить исходный код проекта, разархивируйте его, получите «SQL-скрипт инициализации базы данных планирования» и выполните его. При нормальных обстоятельствах должно быть создано 16 таблиц. Расположение сценария SQL:/xxl-job/doc/db/tables_xxl_job.sql
Имя таблицы | эффект |
---|---|
xxl_job_group | Таблица информации об исполнителе: Информация об исполнителе задач по техническому обслуживанию |
xxl_job_info | Таблица расширенной информации планирования: используется для сохранения расширенной информации о задачах планирования xxl-заданий, такой как группировка задач, имя задачи, адрес машины, исполнитель, входные параметры выполнения, электронные письма с сигналами тревоги и т. д. |
xxl_job_lock | Таблица блокировки планирования задач |
xxl_job_log | Таблица журнала планирования: используется для сохранения исторической информации о задачах планирования xxl-заданий, такой как результаты планирования, результаты выполнения, входные параметры планирования, планирование машин и исполнителей и т. д. |
xxl_job_log_report | Отчет журнала планирования: пользователь сохраняет отчет журнала планирования задач xxl-job, который будет использоваться на странице функции отчета диспетчерского центра. |
xxl_job_logglue | Журнал задач GLUE: используется для сохранения истории обновлений GLUE и поддержки функции обратного отслеживания версий GLUE. |
xxl_job_registry | Реестр исполнителей: хранит онлайн-информацию об адресах компьютеров исполнителей и диспетчерских центров. |
xxl_job_user | Таблица пользователей системы |
Примечание⚠️: Диспетчерский центр поддерживает развертывание кластера. В кластере каждый узел должен быть подключен к одному и тому же экземпляру MySQL;
если MySQL используется в качестве главного-подчиненного, узел кластера диспетчерского центра должен быть принудительно использован основной базой данных.
Шаг 1. Настройка, развертывание и т. д. центра планирования (xxl-job-admin).
Проект центра планирования: xxl-job-admin
Роль: унифицированное управление задачами планирования на платформе планирования задач, ответственное за инициирование выполнения планирования и предоставление платформы управления задачами.
Адрес файла конфигурации диспетчерского центра: /xxl-job/xxl-job-admin/src/main/resources/xxl-job-admin.properties
### 调度中心JDBC链接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
### 登录账号
xxl.job.login.username=admin
xxl.job.login.password=123456
### 调度中心通讯TOKEN,用于调度中心和执行器之间的通讯进行数据加密,非空时启用
xxl.job.accessToken=
### 调度中心国际化设置,默认为中文版本,值设置为“en”时切换为英文版本
xxl.job.i18n=
Начало: развертывание проекта.
Если описанная выше конфигурация выполнена правильно, проект можно скомпилировать, упаковать и развернуть. Адрес доступа диспетчерского центра: http://localhost:8080/xxl-job-admin (этот адрес будет использоваться исполнителем как адрес обратного вызова) После входа в систему работающий интерфейс будет выглядеть так, как показано на рисунке ниже. Учетная запись для входа по умолчанию — «admin/123456»
. Проект «Диспетчерский центр» успешно развернут.
Кластер диспетчерского центра.
Диспетчерский центр поддерживает развертывание кластера для улучшения аварийного восстановления и доступности диспетчерской системы.
При развертывании кластера диспетчерского центра существует ряд требований и предложений:
- Конфигурация БД остается согласованной;
- Конфигурация учетной записи для входа остается неизменной;
- Машинные часы кластера остаются постоянными (кластеры с одной машиной их игнорируют);
- Рекомендация: рекомендуется использовать nginx для балансировки нагрузки кластера диспетчерского центра и распределения доменных имен. Такие операции, как доступ к диспетчерскому центру, настройка обратного вызова исполнителя и вызов служб API, выполняются через это доменное имя.
Шаг 2. Настройка и использование исполнителя xxl-job-executor в проекте
xxl-job-excutor — это модуль выполнения задач, который необходимо внедрить в бизнес-систему.
Шаг 1. Добавьте в свой проект зависимости xxl-job-core.
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.0.1</version>
</dependency>
Шаг 2. Добавьте файл конфигурации проекта.
Номера веб-порта и порта исполнителя различаются.Адреса адресов диспетчерского центра и имя приложения-исполнителя совпадают.
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-athena
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;
xxl.job.executor.logretentiondays=-1
Шаг 3. Добавьте класс конфигурации XxlJobConfig:
Инициализируйте XxlJobSpringExecutor в XxljobConfig. Этот класс используется для управления связью между xxl-job-admin и xxl-job-excutor и обработки задач.
package com.xxl.job.executor.core.config;
import com.xxl.job.core.executor.XxlJobExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
@ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobExecutor xxlJobExecutor() {
logger.info(">>>>>>>>>>> xxl-job config init.");
XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
xxlJobExecutor.setAdminAddresses(adminAddresses);
xxlJobExecutor.setAppName(appName);
xxlJobExecutor.setIp(ip);
xxlJobExecutor.setPort(port);
xxlJobExecutor.setAccessToken(accessToken);
xxlJobExecutor.setLogPath(logPath);
xxlJobExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobExecutor;
}
}
Шаг 4. Создайте задачи в проекте.
1. Наследовать «IJobHandler»: «com.xxl.job.core.handler.IJobHandler»;
2. Зарегистрироваться в контейнере Spring: добавить аннотацию «@Component» и сканироваться как экземпляр Bean контейнером Spring;
3. Зарегистрируйтесь в фабрике исполнителей: добавьте аннотацию "@JobHandler(value="custom jobhandler name")". Значение аннотации соответствует значению атрибута JobHandler новой задачи в диспетчерском центре.
@JobHandler(value="jobtest")
@Component
public class job_test extends IJobHandler {
@Override
public ReturnT<String> execute(String s) throws Exception {
try {
System.out.println("测试~~~");
/*测试数据*/
return SUCCESS;
} catch (Exception e){
e.printStackTrace();
return FAIL;
}
}
}
Шаг 5. Кластер проектов-исполнителей (необязательно)
Исполнитель поддерживает развертывание кластера, повышая доступность системы планирования и улучшая возможности обработки задач.
При развертывании кластера исполнителей существует ряд требований и предложений:
- Адреса обратного вызова исполнителя (xxl.job.admin.addresses) должны быть согласованными; исполнитель выполняет такие операции, как автоматическая регистрация исполнителя, на основе этой конфигурации.
- Имя приложения (xxl.job.executor.appname) в одном и том же кластере исполнителей должно быть согласованным; диспетчерский центр динамически обнаруживает онлайн-списки исполнителей различных кластеров на основе этой конфигурации.
Шаг 3. Воспользуйтесь диспетчерским центром
1. Управление исполнителем
Примечание. При автоматической регистрации адрес компьютера-исполнителя будет найден на основе имени приложения. В это время имя приложения должно совпадать с именем приложения в файле конфигурации исполнителя application.properties. При регистрации вручную имя приложения может быть несовместимым. , но адрес машины должен соответствовать xxl
. job.executor.ip остается согласованным.
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=192.168.21.168
xxl.job.executor.port=9999
Описание атрибута исполнителя
AppName: это уникальный идентификатор AppName каждого кластера исполнителей. Исполнитель периодически автоматически регистрируется с AppName в качестве объекта. Эту конфигурацию можно использовать для автоматического обнаружения успешно зарегистрированных исполнителей для использования при планировании задач;
Имя: имя исполнителя.Поскольку имя приложения ограничено буквами и цифрами, читаемость не очень хорошая.Имя используется для улучшения читаемости исполнителя;
Сортировка: Сортировка исполнителей.При необходимости в системе исполнителей, при добавлении задачи, доступный список исполнителей будет читаться в соответствии с этой сортировкой;
Способ регистрации: Как диспетчерский центр получает адрес исполнителя;
Автоматическая регистрация: исполнитель автоматически регистрирует исполнителя, и диспетчерский центр может динамически определять адрес компьютера исполнителя через базовый реестр;
Ручной ввод: вручную введите адресную информацию исполнителя с несколькими адресами, разделенными запятыми, для использования диспетчерским центром;
Адрес машины: действует, когда «Метод регистрации» установлен на «Ввод вручную», поддерживает ручное ведение информации об адресе привода;
2. Управление задачами
После нажатия кнопки «Добавить задачу»
содержимое созданного обработчика задания задачи должно соответствовать значению @jobhandler в коде задачи.
Рабочий режим:
- Режим BEAN: поддерживает разработку на основе классов, где каждая задача соответствует классу Java.
- Режим GLUE: задачи сохраняются в диспетчерском центре в режиме исходного кода, поддерживают онлайн-обновления через Web IDE, компиляцию в реальном времени и вступают в силу, поэтому нет необходимости указывать JobHandler.
Стратегия маршрутизации: стратегия выбора исполнителя для выполнения определенной задачи в режиме кластера.
3. Управление журналом.После выполнения задачи вы можете просмотреть журнал диспетчеризации в диспетчерском центре.
Время планирования: время, когда «Центр планирования» запускает это планирование и отправляет сигнал выполнения задачи «Исполнителю»; Результат
планирования: результат, когда «Центр планирования» запускает это планирование, 200 означает успех, 500 или другие означают неудачу;
Примечания к планированию : «Центр планирования» запускает информацию журнала этого планирования;
Адрес исполнителя: адрес машины, на которой выполняется эта задача.
Режим выполнения: режим выполнения задачи при запуске планирования. Информацию о режиме выполнения см. глава «3. Детали задачи»
Параметры задачи: Входные параметры для локального выполнения задачи
Время выполнения: время обратного вызова после выполнения этой задачи в «исполнителе»;
Глядя на два соседних результата планирования, мы можем обнаружить, что задача выполняется двумя исполнителями при опросе.