Устойчивое хранение периодических задач
Данные задач поддерживают прямое внесение в базу данных, что предотвращает потерю данных при перезапуске.
Устойчивость обеспечивается за счет возможности пользовательского расширения.
Реализация интерфейса cloud.agileframework.task.TaskService
позволяет пользователю определять методы хранения,
такие как MySQL, Redis, Oracle и т.д. По умолчанию используется память, но это не поддерживает перезапуск.
Автоматическая загрузка при запуске При запуске приложения вместе с Spring автоматически загружаются данные периодических задач, без необходимости ручной настройки.
Динамическое изменение В процессе выполнения программы поддерживаются изменения через REST API или пользовательскую программу. Это позволяет динамически добавлять, изменять или удалять периодические задачи без необходимости перезапуска сервиса.
Периодические задачи Поддерживаются периодические задачи в виде выражений Spring Cron.
Задачи на конкретное время Поддерживаются задачи на конкретное время, представленные в виде метки времени. Например, задачи, которые должны выполняться только один раз.* Множество выражений Поддерживаются множественные выражения в одной задаче, разделённые английским символом точки с запятой. Это позволяет одновременно использовать несколько выражений для одной задачи, что упрощает создание и обслуживание задач.
Конфликты задач Конфликты задач могут возникнуть на уровне приложений и уровней выражений: конфликт уровня приложений указывает на ситуацию, когда одна и та же задача может быть запущена параллельно несколькими приложениями в распределённой системе или кластере. Agile-task предоставляет интерфейсы блокировки и разблокировки, позволяющие пользователям определять тип блокировки в зависимости от конкретной ситуации. Блокировка может быть реализована с помощью Redis, который предоставляется в составе компонента agile-cache.
Конфликт уровня выражений указывает на ситуацию, когда одно и то же выражение может быть использовано для нескольких задач. Agile-task автоматически вычисляет точки пересечения этих выражений и гарантирует, что каждая точка будет выполнена только один раз.* Набор методов и сортировка Обычно задача связана с одним методом внутри одного приложения, но agile-task также поддерживает связывание нескольких методов с одной задачей. Эти методы можно также сортировать. Когда задача выполняется, она последовательно вызывает связанные методы в порядке, указанном пользователем.*
Определение сложных параметров задач
Поддерживается определение сложных параметров для задач, содержимое которых сохраняется в виде JSON-строки. При выполнении задач эти параметры преобразуются в необходимый тип. Внутри реализованы два часто используемых параметра:* - $Task
: информация о задаче. Когда параметр объявлен как этот идентификатор, процесс выполнения задачи вызывает метод планировщика с информацией о задаче в качестве аргумента.
$TaskCode
: уникальный идентификатор задачи. Когда параметр объявлен как этот идентификатор, процесс выполнения задачи вызывает метод планировщика с уникальным идентификатором задачи в качестве аргумента.Начало вашего первого проекта очень простое.
Вы можете скачать пакет с последней стабильной версией. Этот пакет загружается в центральный репозиторий Maven и может быть указан непосредственно в pom.xml.
Пример использования версии agile-task-2.1.0.M5.jar.
<!-- Объявление центрального репозитория -->
<repositories>
<repository>
<id>cent</id>
<url>https://repo1.maven.org/maven2/</url>
</repository>
</repositories>
<!-- Объявление зависимости -->
<dependency>
<groupId>cloud.agileframework</groupId>
<artifactId>agile-task</artifactId>
<version>2.1.0.M5</version>
</dependency>
// Ключ активации компонента, значение по умолчанию `true`, чтобы включить
agile.task.enable=true
// Ключ активации REST API компонента, значение по умолчанию `false`, чтобы отключить
agile.task.controller.enable=true
// Например, создайте задачу с уникальным идентификатором 24, которая выполняется каждую секунду. Вызовите следующий URL с указанным ниже body параметром. URL: POST http://localhost:8080/task Параметры: { "code": "1", "name": "task", "cron": "0/1 * * * * ?", "sync": true, "enable": true, "targets": [ { "code": "public void cloud.agileframework.task.controller.TaskController.hello(cloud.agileframework.task.Task)", "argument": "$Task" } ] }
Журнал выполнения задач```
2020-08-12 10:31:20.466 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Завершена]
2020-08-12 10:31:20.467 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Следующее выполнение 2020-08-12 10:31:11]
2020-08-12 10:31:21.006 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Начало выполнения]
2020-08-12 10:31:20.466 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Завершена]
2020-08-12 10:31:20.467 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Следующее выполнение 2020-08-12 10:31:12]
2020-08-12 10:31:21.006 INFO 16320 --- [ pool-1-定期任务-3] cloud.agileframework.task.TaskJob : Задача:[24][Начало выполнения]
...
// Например, используя только что созданную задачу №24
Адрес для остановки: POST http://localhost:8080/task/24/false
Адрес для запуска: POST http://localhost:8080/task/24/true
// Например, используя только что созданную задачу №24
Адрес: GET http://localhost:8080/task/24
// Запрос всех задач
Адрес: GET http://localhost:8080/task
```##### RESTful методы для обновления данных
// Например, используя только что созданную задачу №24, изменяем период выполнения задачи на несколько выражений, а параметры заменяем произвольной строкой Адрес: POST http://localhost:8080/task Параметры: { "code": "1", "name": "task", "cron": "0/1 * * * * ?", "sync": true, "enable": true, "targets": [ { "code": "public void cloud.agileframework.task.controller.TaskController.hello(java.lang.String)", "argument": "Это входящий параметр, он также может быть JSON-структурой" } ] }
#### Продвинутый уровень 1: Настройка способа хранения данных
##### Настраиваемая структура данных задачи
> Структура задачи: `cloud.agileframework.task.Task`
> По умолчанию: `cloud.agileframework.task.controller.CustomTask`
> Интерфейс для хранения задач: `cloud.aglieframework.task.TaskService`
> По умолчанию: `cloud.aglieframework.task.TaskServiceImpl`
##### Описание структуры данных
**Определение задач (`cloud.aglieframework.task.Task`)**
```java
public interface Task {
/**
* Получает уникальный идентификатор задачи
*
* @return Уникальный идентификатор
*/
Long getCode();
/**
* Получает имя задачи
*
* @return Имя задачи
*/
String getName();
/**
* Получает cron-выражение
*
* @return Выражение для планировщика задач
*/
String getCron();
/**
* Возвращает значение синхронизации в кластере
*
* @return Булево значение
*/
Boolean getSync();
/**
* Возвращает значение доступности задачи
*
* @return Булево значение
*/
Boolean getEnable();
}
``````markdown
/**
* Получает уникальный идентификатор цели задачи
*
* @return Уникальный идентификатор
*/
Method getMethod();
/**
* Получает входные данные задачи
*
* @return Входные данные
*/
String getArgument();
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )