[Запланированные задачи]---- xxl-job, @Scheduled

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. Детали задачи»
Параметры задачи: Входные параметры для локального выполнения задачи
Время выполнения: время обратного вызова после выполнения этой задачи в «исполнителе»;

Глядя на два соседних результата планирования, мы можем обнаружить, что задача выполняется двумя исполнителями при опросе.
Вставьте сюда описание изображенияВставьте сюда описание изображения

Supongo que te gusta

Origin blog.csdn.net/m0_46459413/article/details/128618089
Recomendado
Clasificación