Всеобъемлющее и подробное объяснение структуры распределенного планирования XXL-JOB, достаточно одной статьи!

Java

Всестороннее и подробное объяснение структуры распределенного планирования XXL-JOB.

1. Обзор XXL-JOB

1.1 Что такое XXL-JOB?

  • Официальное описание: XXL-JOB – это легкая распределенная платформа для планирования задач. Ее основными целями являются быстрая разработка, простота обучения, легкость и простота расширения. Теперь с открытым исходным кодом и подключен к линейкам онлайн-продуктов многих компаний, из коробки.
  • С точки зрения непрофессионала: XXL-JOB — это среда планирования задач. Путем введения зависимостей, связанных с XXL-JOB, и написания кода в соответствии с соответствующим форматом задачи могут выполняться в его визуальном интерфейсе.запускать,воплощать в жизнь,прерватьи включаетРегистрация и запросыимониторинг состояния задач
  • Если XXL-JOB описывается как человек, каждый микросервис, представляющий xxl-job, эквивалентен независимому лицу (исполнителю) и записывается в соответствии с соответствующим условным форматом.Handlerдля стола食物, визуальный интерфейс может решить, какой исполнитель (человек) есть или не есть что-то (задача на время), в какое время есть (управление выражением кукурузы или выполнить или завершить или; начать немедленно);
  • Недостатки Quartz: Quartz, как лидер в области планирования задач с открытым исходным кодом, является первым выбором для планирования задач. Однако в кластерной среде Quartz использует API для управления задачами, что имеет следующие проблемы:
    • Управляйте задачами, вызывая API, что неудобно для пользователя.
    • QuartzJobBean, который должен сохранять бизнес, помещается в базовую таблицу данных, и система довольно навязчива.
    • Логика планирования и кварцжоббена в сочетании в одном проекте, что приведет к проблеме. Когда количество задач планирования постепенно увеличивается, и логика задачи планирования постепенно увеличивается, производительность системы планирования будет очень ограничена бизнесом.

XXL-JOB компенсирует вышеупомянутые недостатки Quartz.

  • RemoteHttpJobBean:
    • При разработке обычного Quartz логика задачи обычно сохраняется в QuartzJobBean, и связь очень серьезная.

    • «Модуль планирования» и «модуль задач» в XXL-JOB полностью разделены, и все задачи планирования в модуле планирования используют один и тот же QuartzJobBean, то есть RemoteHttpJobBean. Различные задачи планирования поддерживают свои собственные параметры планирования в своих собственных данных таблицы расширения.Когда RemoteHttpJobBean инициируется для выполнения, он анализирует различные параметры планирования для инициирования удаленных вызовов и вызова соответствующих служб удаленного исполнителя.

    • Эта модель вызова аналогична вызову RPC, RemoteHttpJobBean обеспечивает функцию вызова прокси, а исполнитель обеспечивает функцию удаленного обслуживания.

  • Архитектурный дизайн
    • XL-JOB абстрагирует поведение планирования в общедоступную платформу «диспетчерского центра», в то время как сама платформа не выполняет бизнес-логику, а «диспетчерский центр» отвечает только за инициирование диспетчерских запросов.

    • Задачи абстрагируются в разрозненные обработчики заданий, которыми управляет «исполнитель», который отвечает за получение запросов планирования и выполнение бизнес-логики в соответствующем обработчике заданий.

    • Следовательно, две части «планирование» и «задача» могут быть разделены на модуль планирования и модуль выполнения для повышения общей стабильности и масштабируемости бизнес-системы:

    • Модуль планирования (центр планирования): отвечает за управление информацией о планировании, отправку запросов на планирование в соответствии с конфигурацией планирования и не отвечает за сам бизнес-код. Система планирования отделена от задач, что повышает доступность и стабильность системы, а производительность системы планирования больше не ограничивается модулем задач; она поддерживает визуальное, простое и динамическое управление информацией планирования, включая создание, обновление, удаление задач. и разработка GLUE, а также оповещения о задачах и т. д., все вышеперечисленные операции будут выполняться в режиме реального времени и поддерживать мониторинг результатов планирования и журналов выполнения, а также отказоустойчивость исполнителя.

    • Модуль выполнения (исполнитель): отвечает за получение запросов планирования и выполнение логики задачи. Модуль задач фокусируется на таких операциях, как выполнение задач, что делает разработку и обслуживание проще и эффективнее; он получает запросы на выполнение, запросы на завершение и запросы на регистрацию из «центра планирования».

  • Системная архитектура XXL-JOB показана на следующем рисунке:

在这里插入图片描述

1.2 Особенности

  1. Простота: поддержка операций CRUD над задачами через веб-страницы, операция проста, и вы можете начать работу за одну минуту;
  2. Динамический: поддерживает динамическое изменение состояния задачи, запуск/остановку задач и завершение запущенных задач с немедленным эффектом;
  3. Высокая доступность центра планирования (централизованная): Планирование принимает централизованный дизайн. «Диспетчерский центр» самостоятельно разработал компоненты планирования и поддерживает развертывание кластера, что может обеспечить высокую доступность центра планирования;
  4. Executor HA (распределенный): Распределенное выполнение задач, задача «исполнитель» поддерживает кластерное развертывание и обеспечивает выполнение задачи HA;
  5. Центр регистрации: исполнитель будет периодически автоматически регистрировать задачи, а центр планирования автоматически обнаружит зарегистрированные задачи и инициирует выполнение. В то же время он также поддерживает ручной ввод адреса привода;
  6. Расширение и сокращение гибкой емкости: как только новый компьютер-исполнитель подключается к сети или отключается, задача будет переназначена в следующий раз, когда она будет запланирована;
  7. Стратегия маршрутизации. Кластер исполнителей предоставляет разнообразные стратегии маршрутизации, в том числе: первый, последний, циклический, случайный, непротиворечивый HASH, наименее часто используемый, последний неиспользованный, отработка отказа, занятая передача и т. д.;
  8. Отказоустойчивость: когда политика маршрутизации задач выбирает «отказоустойчивость», в случае сбоя машины в кластере исполнителей она автоматически переключается на обычный исполнитель для отправки запросов планирования.
  9. Стратегия блокирующей обработки. Стратегия обработки, когда планирование слишком интенсивно для выполнения исполнителем, стратегии включают в себя: автономный последовательный (по умолчанию), отбрасывание последующего планирования и перезапись предыдущего планирования;
  10. Контроль тайм-аута задачи: поддержка пользовательского тайм-аута задачи, тайм-аут выполнения задачи будет активно прерывать задачу;
  11. Повторная попытка при сбое задачи: поддерживает настраиваемое время повторной попытки при сбое задачи.При сбое задачи она будет активно повторяться в соответствии с предустановленным временем повторной попытки при сбое.
  12. Оповещение о сбое задачи; оповещение о сбое электронной почты предоставляется по умолчанию, а интерфейс расширения зарезервирован для простого расширения методов оповещения, таких как SMS и DingTalk;
  13. Разделенная широковещательная задача: когда кластер исполнителей развернут, когда политика маршрутизации задач выбирает «Раздельная широковещательная рассылка», планирование задач будет транслироваться и запускать все исполнители в кластере для однократного выполнения задачи, а сегментированные задачи могут быть разработаны в соответствии с сегментированием. параметры;
  14. Динамическое сегментирование: широковещательная задача сегментирования сегментируется с исполнителем в качестве измерения, что поддерживает динамическое расширение кластера исполнителя для динамического увеличения количества сегментов и совместной обработки бизнес-процессов; это может значительно улучшить возможности и скорость обработки задач.
  15. Запуск события: в дополнение к «режиму Cron» и «зависимому от задачи режиму», запускающему выполнение задачи, поддерживаются задачи запуска на основе событий. Диспетчерский центр предоставляет сервисы API, запускающие однократное выполнение задач, которые можно гибко запускать в соответствии с бизнес-событиями.
  16. Мониторинг выполнения задачи: мониторинг хода выполнения задачи в режиме реального времени;
  17. Прокручивающийся журнал в реальном времени: поддержка онлайн-просмотра результатов планирования и поддержка просмотра в реальном времени полного журнала выполнения, выводимого исполнителем в прокручивающемся режиме;
  18. GLUE: Предоставляет веб-IDE, поддерживает онлайн-разработку кода логики задач, динамическую публикацию и компиляцию в реальном времени для вступления в силу, минуя процесс развертывания и онлайн. Поддерживает исторический возврат 30 версий.
  19. Скриптовые задачи: поддерживает разработку и выполнение скриптовых задач в режиме GLUE, включая скрипты Shell, Python, NodeJS, PHP, PowerShell и т. д.;
  20. Задачи командной строки: изначально предоставляют общие обработчики задач командной строки (задачи Bean, «CommandJobHandler»); деловым сторонам нужно только предоставить командные строки;
  21. Зависимость от задач: поддерживает настройку зависимостей между подзадачами.Когда родительская задача выполняется и выполняется успешно, она активно инициирует выполнение подзадачи.Несколько подзадач разделяются запятыми;
  22. Согласованность: «Центр планирования» обеспечивает согласованность распределенного планирования кластера с помощью блокировок БД, и планирование одной задачи инициирует только одно выполнение;
  23. Пользовательские параметры задачи: поддержка онлайн-конфигурации входных параметров задачи планирования, которые вступают в силу немедленно;
  24. Пул потоков планирования: многопоточность системы планирования запускает операцию планирования, чтобы гарантировать, что планирование выполняется точно и не блокируется;
  25. Шифрование данных: связь между диспетчерским центром и исполнителем шифруется для повышения безопасности информации об отправке;
  26. Оповещение по электронной почте: поддержка оповещения по электронной почте при сбое задачи, поддержка настройки нескольких адресов электронной почты для отправки электронных сообщений о тревоге;
  27. Нажмите на центральный склад maven: последняя стабильная версия будет отправлена ​​​​на центральный склад maven, что удобно для пользователей для доступа и использования;
  28. Текущий отчет: поддержка просмотра в реальном времени текущих данных, таких как количество задач, время планирования, исполнители и т. д., а также отчеты о планировании, такие как карта распределения даты планирования, карта распределения успешного планирования и т. д.;
  29. Полностью асинхронный: процесс планирования задач разработан и реализован полностью асинхронно, например, асинхронное планирование, асинхронная работа, асинхронный обратный вызов и т. д., что может эффективно уменьшить пики трафика для интенсивного планирования и теоретически поддерживать работу задач любой продолжительности;
  30. Кросс-платформенность: изначально предоставляет общий обработчик задач HTTP (задача Bean, «HttpJobHandler»); деловым сторонам нужно только предоставить ссылки HTTP, без ограничений по языку или платформе;
  31. Интернационализация: Диспетчерский центр поддерживает настройки интернационализации, предоставляя два дополнительных языка, китайский и английский, по умолчанию используется китайский;
  32. Контейнеризация: предоставьте официальные образы докеров, а также обновите и отправьте dockerhub в режиме реального времени, чтобы еще больше реализовать готовое использование продуктов;
  33. Изоляция пула потоков: пул потоков планирования изолирован и разделен, а медленные задачи автоматически переводятся в пул «медленных» потоков, чтобы избежать исчерпания потоков планирования и повысить стабильность системы;
  34. Управление пользователями: поддержка онлайн-управления пользователями системы, есть две роли администратора и обычного пользователя;
  35. Контроль разрешений: параметр «исполнитель» управляет разрешениями, администратор имеет полные права, а обычные пользователи должны назначать разрешения исполнителя, прежде чем разрешать связанные операции;

1.3 Официально предоставленная информация:

  • Адрес документа:www.xuxueli.com/xxl-job/#/
  • Адрес источника:
  • окрестности:
    • Maven 3+
    • Jdk 1.7+
    • Mysql 5.6+
  • Быстрый старт:
    • Для введения в шаги для быстрого создания структуры XXL-задания, пожалуйста, обратитесь к официальной документации:

ООО "Сюй xueli .com / Спасибо - Джоб / # /? ...

2. Использование XXL-JOB

2.1 Подготовка — настройка центра планирования

  1. Загрузите официальный исходный код
  2. Импортируйте таблицу базы данных из table_xxl_job.sql из каталога /xxl-job/doc/db/ проекта в базу данных.

2.2 Настройка привода

  1. Импорт пакетов зависимостей:
     <!-- xxl-job-core -->
        <dependency>
            <groupId>com.cdmtc</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.0.2</version>
        </dependency>
  1. Настройте элементы конфигурации:

在这里插入图片描述

Номер порта изменен на 8888, так что запись.xxl.job.admin.address здесьВизуальный интерфейсНастроенный номер порта был изменен на 8888 executor: информация о конфигурации Executor

  • Значение соответствующих элементов конфигурации привода XXL-JOB следующее:
    • xxl.job.admin.addresses Адрес развертывания диспетчерского центра. Если диспетчерский центр развернут в кластере и адресов несколько, разделите их запятыми. Исполнитель будет использовать этот адрес для «регистрации пульса исполнителя» и «обратного вызова результата задачи».

    • xxl.job.executor.appname Имя приложения исполнителя, которое является основой группировки для регистрации пульса исполнителей.

    • xxl.job.executor.ip IP-адрес исполнителя, используемый для «Запроса центра планирования и триггерных задач» и «Регистрации исполнителя». IP-адрес исполнителя по умолчанию пуст, что означает, что IP-адрес получен автоматически. При наличии нескольких сетевых карт указанный IP-адрес можно задать вручную, и узел будет привязан при ручной установке IP-адреса.

    • xxl.job.executor.port Номер порта исполнителя, значение по умолчанию 9999. При развертывании нескольких приводов на одной машине будьте осторожны при настройке разных портов привода.

    • xxl.job.accessToken Коммуникационный маркер исполнителя, включенный, если он не равен нулю.

    • xxl.job.executor.logpath Путь хранения файла журнала, выводимого исполнителем. Вам необходимо иметь права на чтение и запись для этого пути.

    • xxl.job.executor.logretentiondays Функция периодической очистки файлов журнала исполнителя, указание количества дней для хранения журнала, и файлы журнала автоматически удаляются по истечении срока их действия. Ограничено сохранение не менее 3 дней, иначе функция не вступит в силу.

Обратите внимание, что конфигурационный файл исполнителя XXL-JOB также можно передать в Disconf для хостинга.

  1. Создайте XxlJobConfig.java
package com.cdmtc.config;

import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
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.Configuration;

/**
 * xxl-job config
 *
 * @author xuxueli 2017-04-28
 */
@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

    @Value("${record.xxl.job.admin.addresses}")
    private String adminAddresses;

    @Value("${record.xxl.job.executor.appname}")
    private String appName;

    @Value("${record.xxl.job.executor.ip}")
    private String ip;

    @Value("${record.xxl.job.executor.port}")
    private int port;

    @Value("${record.xxl.job.accessToken}")
    private String accessToken;

    @Value("${record.xxl.job.executor.logpath}")
    private String logPath;

    @Value("${record.xxl.job.executor.logretentiondays}")
    private int logRetentionDays;


    @Bean(initMethod = "start", destroyMethod = "destroy")
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppName(appName);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;
    }

    /**
     * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
     *
     *      1、引入依赖:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器启动变量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、获取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

Это класс конфигурации привода, используемый для чтения информации о конфигурации привода.

  • В отношении класса конфигурации XxlJobConfig следует отметить две вещи:

  • сканирование компонентов

    • Строка 2 использует аннотацию @ComponentScan для сканирования пакета com.example.demo.jobhandler и загрузки содержащихся в нем обработчиков заданий в контейнер Spring.
  • Получить экземпляр исполнителя

    • Метод xxlJobExecutor() в строке 29 создает экземпляр объекта-исполнителя XXL-JOB, и его метод start() вызывается при инициализации исполнителя, а его метод destroy() вызывается при уничтожении исполнителя.
  1. Добавить запланированную задачу:

在这里插入图片描述

2.3 Настройка визуального интерфейса

  1. Настройте путь к базе данных и другую информацию

在这里插入图片描述

  1. Настроить пароль учетной записи для входа

在这里插入图片描述

Может быть изменен на другой пароль учетной записи

  1. Стартовый проект: XxlJobAdminApplication.java
  2. Авторизуйтесь по адресу визуального интерфейса:http://10.4.7.214:8080/xxl-job-admin/jobinfo[Перед входом в систему вы можете подождать, пока привод будет сконфигурирован. Порт можно настроить или изменить самостоятельно. Значение по умолчанию — 8080. Показанный здесь номер порта — 8888]

Для других операций, таких как настройка кластера, обратитесь к официальной документации.

2.4 Разработка первой задачи Hello, world

  1. Сначала создайте код временной задачи в микросервисе, настроенном с помощью исполнителя:

在这里插入图片描述2. Запускаем проекты микросервисов по очереди (Eureka, config... и т.д.) 3. Запустите диспетчерский центр: XxlJobAdminApplication.java
4. Войдите в диспетчерский центр, введите пароль учетной записи, а затем настройте исполнителя在这里插入图片描述 在这里插入图片描述5. Перейдите на страницу управления задачами在这里插入图片描述6. Нажмите на новую задачу, чтобы настроить соответствующие параметры.v7. Вернуться на страницу управления задачами在这里插入图片描述8. Если вы нажметевыполнять задачи, он будет выполнен только один раз在这里插入图片描述9. Если нажатьбревно, перейти на страницу журнала планирования在这里插入图片描述10. Если вы нажметезапускать, затем напрямую запустите запланированную задачу (выполняйте задачу регулярно в соответствии с выражением кукурузы), и кнопка запуска станет кнопкой остановки在这里插入图片描述

Если кнопка остановки не нажата, она всегда будет находиться в состоянии запуска.Если кнопка остановки нажата, запланированная задача будет остановлена, и выражение кукурузы больше не будет действовать;

11. Если нажалиредактировать, затем перейдите на страницу обновления запланированного задания在这里插入图片描述12. Если вы нажметеУдалить, затем удалите конфигурацию запланированного задания напрямую; 13. Если нажатьАктуатор, отображаются соответствующие временные задачи под исполнителем. 14. Описание задачи и JobHandler являются условиями поиска, и выполняется поиск конфигурации запланированной задачи;

2.5 Запуск отчета

  • Визуально отображать текущий статус запланированных задач
  • Схема выглядит следующим образом:

在这里插入图片描述

III. Визуальный интерфейс каждой функции в деталях

3.1 При добавлении исполнительного механизма необходимо заполнить следующую информацию:

  • AppName: это имя приложения, используемое для уникальной идентификации каждого кластера исполнителей.Исполнитель будет периодически автоматически регистрироваться с AppName в качестве параметра. Благодаря этой конфигурации успешно зарегистрированные исполнители могут быть автоматически обнаружены для использования в планировании задач.
  • Имя: имя исполнительного механизма. Поскольку AppName ограничено буквенно-цифровым составом, удобочитаемость не является строгой. Имя может улучшить удобочитаемость исполнительного механизма.
  • Сортировка: Сортировка исполнителей, где исполнители нужны в системе, например новые задачи, список доступных исполнителей будет прочитан в соответствии с сортировкой.
  • Способ регистрации: Диспетчерский центр может получить адрес исполнителя двумя способами:
  • Автоматическая регистрация: исполнитель автоматически регистрирует исполнителя, и диспетчерский центр может динамически обнаруживать адрес машины исполнителя через базовый реестр.
  • Ручной ввод: Вручную введите адресную информацию привода, разделенную запятыми, для диспетчерского центра.
  • Адрес машины: можно редактировать только в том случае, если «метод регистрации» — «ручной ввод», и поддерживается ручное обслуживание информации об адресе привода.

在这里插入图片描述

Обратите внимание, что значение AppName должно совпадать со значением поля xxl.job.executor.appname в файле application.properties примера проекта, а методом регистрации должна быть автоматическая регистрация. После того, как добавление завершено, в списке исполнителей можно увидеть новый экзекьютор, и я при написании заменил applcation.properties на bootstrap.yml, но содержимое осталось без изменений;

3.2 При добавлении новой задачи необходимо заполнить следующую информацию:

  • Исполнитель: исполнитель, привязанный к задаче.Когда задача запущена и запланирована, успешно зарегистрированный исполнитель будет автоматически обнаружен для реализации функции автоматического обнаружения задачи; с другой стороны, также можно легко группировать задачи. Каждая задача должна быть привязана к исполнителю, который можно установить на странице «Управление исполнителем».
  • Описание задачи: информация описания задачи, которая удобна для управления задачами.
  • Стратегия маршрутизации: при развертывании кластера исполнительных механизмов предоставляются разнообразные стратегии маршрутизации, в том числе:
    • FIRST: Исправлен выбор первой машины.
    • ПОСЛЕДНЯЯ (последняя): Фиксированный выбор последней машины.
    • РАУНД: Каждая машина выбирается по очереди.
    • RANDOM (случайный): случайный выбор онлайн-автоматов.
    • CONSISTENT_HASH (consistent HASH): Каждая задача выбирает определенную машину в соответствии с алгоритмом Hash, и все задачи равномерно хэшируются на разных машинах.
    • LEAST_FREQUENTLY_USED (наименее часто используемый): первым выбирается наименее часто используемый компьютер.
    • LEAST_RECENTLY_USED (последняя неиспользованная): сначала выбирается самая старая используемая машина.
    • FAILOVER (отказоустойчивость): Обнаружение пульса выполняется последовательно, и первый компьютер с успешным обнаружением пульса выбирается в качестве целевого исполнителя и инициирует планирование.
    • BUSYOVER (передача занятости): обнаружение простоя выполняется последовательно, и первая машина с успешным обнаружением простоя выбирается в качестве целевого исполнителя и инициирует планирование.
    • SHARDING_BROADCAST (широковещательная передача): широковещательная рассылка запускает все машины в соответствующем кластере для выполнения задачи с передачей параметров сегментации; задачи сегментации могут разрабатываться в соответствии с параметрами сегментации.
  • Cron: выражение Cron, которое запускает выполнение задачи, в частности Baidu.
  • Режим работы:
    • BEAN-режим: задачи ведутся на стороне исполнителя в виде JobHandler, необходимо сопоставить задачи в исполнителе с атрибутом "JobHandler";
    • Режим GLUE (Java): задача поддерживается в центре планирования в виде исходного кода; задача этого режима на самом деле является кодом класса Java, унаследованным от IJobHandler и поддерживаемым в виде «отличного» исходного кода. проект-исполнитель и может быть использован @Resource/@Autowire внедряет другие сервисы в исполнителе;
    • Режим клей (Shell): задача поддерживается в центре планирования в виде исходного кода; задача в этом режиме на самом деле является сценарием «оболочки»;
    • Режим GLUE (Python): задача сохраняется в центре планирования в виде исходного кода, задача в этом режиме фактически является скриптом «python»;
    • Режим GLUE (NodeJS): задача поддерживается в центре планирования в виде исходного кода, задача этого режима фактически является скриптом «nodejs»;
  • Обработчик заданий:
    • Это вступает в силу только в том случае, если режим работы — «режим BEAN», соответствующий пользовательскому значению аннотации «@JobHandler» недавно разработанного класса JobHandler в исполнителе.
  • Подзадачи:
    • Каждая задача имеет уникальный идентификатор задачи (идентификатор задачи можно получить из списка задач).Когда выполнение этой задачи завершится и выполнение будет успешным, будет запущено активное планирование задачи, соответствующей идентификатору подзадачи.
  • Стратегия блокирующей обработки: стратегия обработки, когда планирование слишком интенсивное, а исполнитель слишком поздно обрабатывает:
    • Аварийный сигнал об ошибке (по умолчанию): при сбое планирования и сбое выполнения срабатывает аварийный сигнал об ошибке, и по умолчанию отправляется электронное письмо с сигналом тревоги.
    • Повторить попытку при сбое: при сбое планирования в дополнение к аварийному сигналу об ошибке он автоматически повторит попытку один раз; обратите внимание, что он не будет повторять попытку в случае сбоя выполнения, а решит, следует ли повторить попытку, в соответствии с возвращаемым значением обратного вызова.
  • Параметры задачи: параметры, необходимые для выполнения задачи. Несколько параметров разделяются запятыми. При выполнении задачи несколько параметров будут преобразованы в массивы и переданы.
  • Аварийная электронная почта: адрес электронной почты для уведомления по электронной почте в случае сбоя планирования задачи. Можно настроить несколько адресов электронной почты. При настройке нескольких адресов электронной почты разделите их запятыми.
  • Ответственный: Лицо, ответственное за задачу.

Обратите внимание, что аналогичное окно появится при редактировании задачи.Что касается входных данных, см. Окно новой задачи.

在这里插入图片描述

3.3 Задачи режима BEAN

  • БИН режим:
    • Логика задачи существует в проекте, где «исполнитель» находится в виде JobHandler, как мы только что продемонстрировали.Hello,WorldСтартовый кейс для
  • В приведенном выше коде следует отметить три вещи:
    • Вы должны использовать аннотацию @JobHandler XXL-JOB (строка 1), указать имя JobHandler как «demoJobHandler», и значение поля JobHandler вновь созданной задачи в диспетчерском центре должно быть таким же, как это.
    • Вы должны наследовать абстрактный класс IJobHandler (строка 3) и реализовать его метод execute(), который является способом реализации логики задачи.
    • Там IJobHandler абстрактный класс init () метод и метод destroy (), два метода являются недействительными, и экземпляр задачи инициализации вызова уничтожен, класс задачи может реализовать выборочно охватывают эти два метода.

3.4 Задачи режима GLUE (Java),

  • Задачи хранятся в центре планирования в виде исходного кода, поддерживают онлайн-обновление через Web IDE, компиляцию и проверку в реальном времени, поэтому нет необходимости указывать JobHandler. Процесс разработки выглядит следующим образом:
  • Шаг 1 Создайте новую задачу планирования
    • Обратитесь к приведенным выше «Свойствам планирования задач», чтобы настроить параметры вновь созданной задачи, и выберите «Режим GLUE (Java)» в качестве режима работы, как показано на следующем рисунке:

在这里插入图片描述

Центр планирования будет планировать эту задачу каждые 15 минут.

  • Шаг 2. Разработайте код задачи

  • Выберите указанную задачу GLUE (Java) в списке задач, нажмите кнопку "GLUE" в правой части задачи, и вы перейдете в интерфейс Web IDE задачи GLUE, где можно разработать код задачи (вы также можно разработать его в IDE).Когда закончите, скопируйте-вставьте в редактор).

  • Функция ретроспективной версии: в интерфейсе Web IDE задачи GLUE выберите раскрывающийся список «Ретроспективная версия» в правом верхнем углу, и будет показана история обновлений задачи GLUE (поддерживается ретроспективная версия 30 версий). , Выберите соответствующую версию, чтобы отобразить код версии. , код GLUE откатится к соответствующей исторической версии после сохранения. Код задачи GLUE и интерфейс Web IDE, как показано ниже:

在这里插入图片描述

3.5 Разделение широковещательных задач

  • Когда кластер исполнителей развернут, когда политика маршрутизации задач выбирает «широковещательную рассылку сегментов», планирование задач будет транслироваться и запускать все исполнители в соответствующем кластере для однократного выполнения задачи и одновременной передачи параметров сегмента, а сегмент может разрабатываться по параметрам шарда Задача.

  • «Шардинговая широковещательная рассылка» использует исполнителей в качестве измерения для сегментирования и поддерживает динамическое расширение кластеров исполнителей для динамического увеличения количества сегментов и совместной обработки бизнес-процессов; это может значительно улучшить возможности и скорость обработки задач при выполнении бизнес-операций большого объема.

  • «Шардированная трансляция» — это то же самое, что и процесс разработки общих задач, разница в том, что параметры шардинга можно получить, а бизнес-обработку шардинга можно выполнить через параметры шардинга. Процесс разработки выглядит следующим образом:

  • Шаг 1. Разработайте код JobHandler

    • В пакете com.example.demo.jobhandler примера проекта создайте новый класс задач ShardingJobHandler.Код ключа выглядит следующим образом:
@JobHandler(value="shardingJobHandler")
@Service
public class ShardingJobHandler extends IJobHandler {
 @Override
 public ReturnT<String> execute(String param) throws Exception {
 // 分片参数
 ShardingUtil.ShardingVO shardingVO = ShardingUtil.getShardingVo();
 XxlJobLogger.log("分片参数:当前分片序号 = {0}, 总分片数 = {1}", shardingVO.getIndex(), shardingVO.getTotal());
 // 业务逻辑
 for (int i = 0; i < shardingVO.getTotal(); i++) {
 if (i == shardingVO.getIndex()) {
 XxlJobLogger.log("第 {0} 片, 命中分片开始处理", i);
 } else {
 XxlJobLogger.log("第 {0} 片, 忽略", i);
 }
 }
 return SUCCESS;
 }
}
  • Строка 9 приведенного выше кода получает параметр shard, а строка 10 — два свойства параметра shard:

    • shardingVO.getIndex() Текущий индекс сегмента (начиная с 0), индекс текущего исполнителя в списке кластера исполнителей.
    • shardingVO.getTotal() Общее количество шардов, общее количество машин в исполнительном кластере.
  • Шаг 2. Создайте новую задачу планирования

    • Обратитесь к вышеприведенным «Свойствам планирования задач», чтобы настроить параметры вновь созданной задачи, выберите «Режим BEAN» для режима работы, «Шардированная широковещательная рассылка» для стратегии маршрутизации и заполните значение, указанное в аннотации задачи @JobHandler. для свойства JobHandler, как показано на следующем рисунке:

在这里插入图片描述

Центр планирования будет транслировать и планировать задачу shardingJobHandler каждые 15 минут (поскольку выражение кукурузы настроено на выполнение один раз каждые 15 минут).

  • Стратегия маршрутизации широковещательной рассылки сегментов применима не только к режиму работы BEAN, но и к режиму работы GLUE (Java). Эта функция применима к следующим бизнес-сценариям:
  • Сценарий задачи шардинга
    • Чтобы кластер из 10 исполнителей обрабатывал 10 Вт фрагментов данных, каждая машина должна обрабатывать только 1 Вт фрагментов данных, что сокращает потребление времени в 10 раз.
  • сцена миссии трансляции
    • Машины-исполнители широковещательной рассылки запускают сценарии оболочки, широковещательные узлы кластера для обновления кэша и т. д.

3.6 Управление задачами

在这里插入图片描述

  • В списке задач вы можете увидеть идентификатор задачи, описание задачи, режим выполнения, Cron, владельца и статус каждой задачи. Пользователь может выполнять следующие операции над задачей:
    • Выполнить: вручную инициировать планирование задачи один раз, не влияя на исходные правила планирования.
    • Пауза/возобновление: Вы можете «приостановить» и «возобновить» задачу. Следует отметить, что пауза/возобновление здесь предназначены только для последующего поведения триггера планирования задачи и не повлияют на запланированную задачу, которая уже была запущена.
    • Журнал: вы можете просмотреть журнал планирования истории задач. Вы можете просмотреть результаты планирования, результаты выполнения и т. д. каждой задачи планирования в интерфейсе истории вызовов.Нажмите кнопку «Журнал выполнения», чтобы просмотреть полный журнал исполнителя.
    • Редактировать: Во всплывающем интерфейсе «Редактировать задачу» вы можете обновить атрибуты задачи и сохранить их.Вы можете изменить установленную информацию об атрибутах задачи.
    • КЛЕЙ: Эта операция предназначена только для задач КЛЕЙ. Вы попадете в интерфейс Web IDE для задачи GLUE, которая поддерживает разработку кода задачи.
    • Удалить: Удалить эту задачу.

3.7 журнал планировщика задач

  • В центре планирования XXL-задания нажмите, чтобы войти в страницу «Журнал планирования».
  1. Просмотр журнала планирования
    • На странице «Журнал планирования» вы можете просмотреть результаты планирования, результаты выполнения и другую информацию о планировании каждой задачи, как показано на следующем рисунке:

在这里插入图片描述- Из журнала планирования можно получить следующую информацию: - Время планирования: время, когда «Центр планирования» запускает это планирование и отправляет сигнал выполнения задачи «Исполнителю». - Результат планирования: «Центр планирования» запускает результат этого планирования, 200 означает успех, 500 или другое значение означает неудачу. - Примечания по планированию: «Центр планирования» активирует информацию журнала этого планирования. - Время выполнения: время обратного вызова в "Исполнителе" после завершения выполнения этой задачи. - Результат выполнения: Результат выполнения этой задачи в "Исполнителе", 200 означает успех, 500 или другое означает неудачу. - Заметки о выполнении: информация журнала о выполнении текущей задачи в «Исполнителе». - В примере проекта журнал планирования находится в /data/applogs/xxl-job/xxl-job-demo.log, который можно настроить в файле logback.xml.

  1. Просмотр журнала выполнения
    • Нажмите кнопку «Журнал выполнения» в правой части журнала строки, чтобы перейти к интерфейсу журнала выполнения, и вы сможете просмотреть полный журнал, напечатанный в бизнес-коде, как показано ниже:

在这里插入图片描述

  1. Завершить запущенные задачи
  • Эта функция предназначена только для текущих задач. На странице журнала задачи нажмите кнопку «Завершить задачу» справа, и исполнителю, соответствующему этой задаче, будет отправлен запрос на завершение задачи, который завершит задачу и очистит всю очередь выполнения задачи, как показано на рисунок ниже.

在这里插入图片描述

  • Завершение задачи достигается путем «прерывания» потока выполнения, что вызывает исключение «InterruptedException». Поэтому, если исключение перехвачено и обработано внутри JobHandler, функция завершения задачи не будет работать.

  • Поэтому, если описанное выше завершение задачи не работает, требуется специальная обработка (бросок вверх) для исключения «InterruptedException» в JobHandler. Кроме того, когда дочерний поток открывается в JobHandler, дочерний поток не может перехватывать и обрабатывать «InterruptedException» и должен активно выбрасывать его вверх.

  1. удалить журнал выполнения

На странице журнала задач после выбора исполнителя и задачи нажмите кнопку «Очистка» справа, и появится всплывающее окно «Очистка журнала», которое поддерживает выбор различных типов политик очистки журнала. После их выбора нажмите кнопку «ОК».Операция очистки журнала может быть выполнена, как показано на следующем рисунке:在这里插入图片描述

3.8 Аварийный сигнал отказа выполнения

  • Обзор: Когда запланированная задача завершается неудачно, журнал автоматически записывает результат отказа, и когда почтовый ящик настроен в Applications.Properties в задании CDMTC.XXL, его можно напомнить по электронной почте;

  • Демонстрация эффекта:

在这里插入图片描述

  • Каждый раз, когда выполнение терпит неудачу, можно напомнить

在这里插入图片描述

  • Для включения функции СМС-напоминания необходимо получить код авторизации с почтового ящика.Способ получения каждого почтового ящика может быть разным, и вы можете указать Baidu, почтовый ящик qq отнастраиватьв кнопкеСчетЗатем выберитеPOP3/SMTPService, нажмите, чтобы открыть, и следуйте инструкциям, чтобы получить код авторизации;

在这里插入图片描述

  • Получите значок кода авторизации:

在这里插入图片描述

Код авторизации — это пароль в конфигурационном файле

4. Удаленный вызов XXL-JOB

4.1 Описание API удаленного вызова

  • Это реализуется с помощью RestTemplate, а также может быть реализовано другими способами.На более позднем этапе также необходимо учитывать проблему кластеризации.Здесь в качестве примера интерфейса удаленного вызова используется только RestTemplate.

4.2 Приготовление окружающей среды

  • pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>springboot_quick</artifactId>
    <version>1.0-SNAPSHOT</version>


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <xdocreport.version>1.0.5</xdocreport.version>
    </properties>


    <dependencies>
        <!--web功能的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

4.3 класс запуска

  • MySpringBootApplication.java
package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

/**
 * create by: zhanglei
 */
//@EnableFeignClients
@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {

        SpringApplication.run(MySpringBootApplication.class);
    }
    @Bean
    RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
        return restTemplateBuilder.build();
    }
}

4.4 Класс испытаний

  • TestDemo.java
import com.demo.MySpringBootApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;

/**
 * @create_by: zhanglei
 * @craete_time 2019/7/2
 */
@SpringBootTest(classes = MySpringBootApplication.class)
@RunWith(SpringRunner.class)
public class TestDemo {

    @Test
    public void test() {
        System.out.println("hello,world");
    }

    @Autowired
    private RestTemplate restTemplate;

    /* Cookie 是根据用户名密码生成的,基本不变,可直接保存数据库或者Redis,然后读取即不必反复登录 */
    /* Cookie 如果后期Cookie有失效时间了,则可用定时任务定时刷新或者失效重登重新保存即可 */

    /**
     * 模拟登录并拿到Cookie
     */
    @Test
    public void login(){
        HttpHeaders headers = new HttpHeaders();
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("userName", "admin");
        map.add("password","123456");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/login", request, String.class);
        System.out.println(response.getHeaders().get("Set-Cookie").get(0));                //      XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly
    }


/*   组操作---> 对执行器进行操作  */

    /**
     * 保存组Group
     */
    @Test
    public void saveGroup(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("appName", "xxl-job-executor-cdmtc-record");        //应用名称
        map.add("title", "测试执行器");      //执行器名称
        map.add("order", "1");          //排序方式
        map.add("addressType", "1");        //注册方式 :  0为
        map.add("addressList", "10.4.7.214:9999,10.4.7.214:9999");          //多地址逗号分隔
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobgroup/save", request, String.class);
        System.out.println(response.getBody());        // {"code":200,"msg":null,"content":null}   返回此,且数据库增加数据即为成功
    }

    /**
     * 修改组
     */
    @Test
    public void updateGroup(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","4");          //修改的,id一定不能为空
        map.add("appName", "xxl-job-executor-cdmtc-record");        //应用名称
        map.add("title", "测试执行器323223");      //执行器名称
        map.add("order", "1");          //排序方式
        map.add("addressType", "1");        //注册方式 :  0为
        map.add("addressList", "10.4.7.214:9999");          //多地址逗号分隔
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobgroup/update", request, String.class);
        System.out.println(response.getBody());         //{"code":200,"msg":null,"content":null}
    }

    /**
     * 删除组
     */
    @Test
    public void removeGroup(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","4");          //删除的,id一定不能为空
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobgroup/remove", request, String.class);
        System.out.println(response.getBody());         //{"code":200,"msg":null,"content":null}
    }

    /* 定时任务操作:查询,新增,编辑,启动,停止,删除等*/
    /**
     * 获取指定的执行器下的任务列表
     */
    @Test
    public void pageList(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("jobGroup", "2");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/pageList", request, String.class);
        System.out.println(response.getBody());             //{"recordsFiltered":4,"data":[{"id":13,"jobGroup":2,"jobCron":"0/1 * * * * ? ","jobDesc":"测试HelloWorld","addTime":1561687650000,"updateTime":1562037928000,"author":"zhanglei","alarmEmail":"1326209681@qq.com","executorRouteStrategy":"FIRST","executorHandler":"firstJobHandler","executorParam":"456464564","executorBlockStrategy":"SERIAL_EXECUTION","executorTimeout":0,"executorFailRetryCount":0,"glueType":"BEAN","glueSource":"","glueRemark":"GLUE代码初始化","glueUpdatetime":1561687650000,"childJobId":"","jobStatus":"NONE"},{"id":12,"jobGroup":2,"jobCron":"0/1 * * * * ? ","jobDesc":"测试HelloWorld","addTime":1561612429000,"updateTime":1561612429000,"author":"zhanglei","alarmEmail":"","executorRouteStrategy":"FIRST","executorHandler":"firstJobHandler","executorParam":"","executorBlockStrategy":"SERIAL_EXECUTION","executorTimeout":0,"executorFailRetryCount":0,"glueType":"BEAN","glueSource":"","glueRemark":"GLUE代码初始化","glueUpdatetime":1561612429000,"childJobId":"","jobStatus":"NONE"},{"id":4,"jobGroup":2,"jobCron":"0/1 * * * * ? ","jobDesc":"测试任务1","addTime":1561538414000,"updateTime":1561538431000,"author":"XXL","alarmEmail":"","executorRouteStrategy":"FIRST","executorHandler":"firstJobHandler","executorParam":"123","executorBlockStrategy":"SERIAL_EXECUTION","executorTimeout":100,"executorFailRetryCount":0,"glueType":"BEAN","glueSource":"","glueRemark":"GLUE代码初始化","glueUpdatetime":1561538414000,"childJobId":"","jobStatus":"NONE"},{"id":2,"jobGroup":2,"jobCron":"0/1 * * * * ? ","jobDesc":"测试任务1","addTime":1561532680000,"updateTime":1561612757000,"author":"XXL","alarmEmail":"","executorRouteStrategy":"FIRST","executorHandler":"demoJobHandler","executorParam":"123","executorBlockStrategy":"SERIAL_EXECUTION","executorTimeout":101,"executorFailRetryCount":1,"glueType":"BEAN","glueSource":"","glueRemark":"GLUE代码初始化","glueUpdatetime":1561532680000,"childJobId":"","jobStatus":"NONE"}],"recordsTotal":4}
    }

    /**
     * 增加定时任务配置
     */
    @Test
    public void addInfo(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("jobGroup","1");        //执行器主键id
        map.add("jobCron","0/1 * * * * ? ");        //表达式
        map.add("jobDesc","测试任务我是最新的测试任务啊啊啊啊啊啊");         //任务描述
        map.add("author","zhanglei");           //负责人
        map.add("alarmEmail","1326209681@qq.com");     //报警邮件
        map.add("executorRouteStrategy","FIRST");            //执行器路由策略
        map.add("executorHandler","测试JobHandler");              //执行器,任务Handler名称
        map.add("executorParam","121454");            //执行器,任务参数
        map.add("executorBlockStrategy","SERIAL_EXECUTION");        //阻塞处理策略
        map.add("executorTimeout","101");          //任务执行超时时间,单位秒
        map.add("executorFailRetryCount","1");       //失败重试次数
        map.add("glueType","BEAN");                 //GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
        map.add("glueSource","");               //GLUE源代码
        map.add("glueRemark","GLUE代码初始化");               //GLUE备注
        map.add("childJobId","");               //子任务ID,多个逗号分隔
//        map.add("jobStatus","");                //任务状态 【base on quartz】
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/add", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":"15"}
    }

    /**
     * 修改定时任务配置
     */
    @Test
    public void updateInfo(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","14");             //注意:修改必须带主键
        map.add("jobGroup","1");        //执行器主键id
        map.add("jobCron","0/1 * * * * ? ");        //表达式
        map.add("jobDesc","测试任务我是最新的测试任务啊啊啊啊啊啊");         //任务描述
        map.add("author","zhanglei");           //负责人
        map.add("alarmEmail","1326209681@qq.com");     //报警邮件
        map.add("executorRouteStrategy","FIRST");            //执行器路由策略
        map.add("executorHandler","测试JobHandler");              //执行器,任务Handler名称
        map.add("executorParam","121454");            //执行器,任务参数
        map.add("executorBlockStrategy","SERIAL_EXECUTION");        //阻塞处理策略
        map.add("executorTimeout","101");          //任务执行超时时间,单位秒
        map.add("executorFailRetryCount","1");       //失败重试次数
        map.add("glueType","BEAN");                 //GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
        map.add("glueSource","");               //GLUE源代码
        map.add("glueRemark","GLUE代码初始化");               //GLUE备注
        map.add("childJobId","");               //子任务ID,多个逗号分隔
//        map.add("jobStatus","");                //任务状态 【base on quartz】
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/update", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":null}
    }

    /**
     * 删除定时任务配置
     */
    @Test
    public void removeInfo(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","15");             //注意:删除必须带主键
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/remove", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":null}
    }

    /**
     * 启动定时任务
     */
    @Test
    public void startInfo(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","13");             //启动的任务id
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/start", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":null}
    }


    /**
     * 停止定时任务
     */
    @Test
    public void stopInfo(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","13");             //启动的任务id
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/stop", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":null}
    }

    /**
     * 执行一次定时任务
     */
    @Test
    public void startOne(){
        HttpHeaders headers = new HttpHeaders();
        List<String> cookies = new ArrayList<>();
        /* 登录获取Cookie 这里是直接给Cookie,可使用下方的login方法拿到Cookie给入*/
        cookies.add("XXL_JOB_LOGIN_IDENTITY=6333303830376536353837616465323835626137616465396638383162336437; Path=/; HttpOnly");
        headers.put(HttpHeaders.COOKIE,cookies);
        MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
        map.add("id","13");             //启动的任务id
        map.add("executorParam","13");             //启动的任务参数
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
        ResponseEntity<String> response = restTemplate.postForEntity("http://localhost:8888/xxl-job-admin/jobinfo/trigger", request, String.class);
        System.out.println(response.getBody());             //{"code":200,"msg":null,"content":null}
    }


}



4.5 Заключение

  • В дополнение к общим функциям, представленным в этой статье, XXL-JOB также имеет расширенные функции, такие как зависимости задач, запуск событий, токены доступа и аварийное переключение.
  • Из примера проекта видно, что XXL-JOB имеет очень мощную функцию унифицированного планирования задач, которую можно применять к большинству бизнес-сценариев, требующих планирования задач. Однако никто не идеален, и XXL-JOB также имеет небольшой недостаток, то есть отсутствие механизма авторизации пользователей, вся система имеет только одного пользователя, а его имя пользователя и пароль закреплены в xxl-job-In. файл admin.properties, как показано ниже:

在这里插入图片描述

Автор поставил функцию управления полномочиями задач на повестку дня в TODO LIST официального документа XXL-JOB, и последующие версии будут становиться все более и более совершенными!