# agile-task
**Repository Path**: agile-framework/agile-task
## Basic Information
- **Project Name**: agile-task
- **Description**: 任务调度组件
持久化定时任务 任务数据支持直接落入数据库,防止重启数据丢失,持久化防止支持自定义扩展 通过实现接口cloud.agileframework.task.TaskService,可以自定义持久化方式, 如落入MySQL、Redis、Oracle等。默认持久化方式为内存形式,内存形式不支持重启。
启动加载 程序伴随spring应用启动时自动加载定时任务数据,无需人工干预
动态修改 在程序运行过程中,支持通过restful api或自定义程序调用,动态添加、修改、删除定时任务 且不需要重启服务
周期时间任务 支持spring cron表达式形式的周期性定时任务
固定时间点任务 支持以时间戳为表达式的固定时间点任务,如仅需要执行一次的定时任务。
多表达式 支持在一个定时任务中,输入多个固定或周期任务表达式,以英文分号分隔,则任务将同时识别 多表达式,针对同一个任务,避免了按不同周期或时间点创建多个任务定义的繁琐操作,也便于维护。
任务冲突 任务冲突分应用级别冲突与表达式级别冲突: 应用级别冲突指在分布式或集群中,相同任务,在同
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 3
- **Created**: 2020-08-12
- **Last Updated**: 2025-02-08
## Categories & Tags
**Categories**: task-schedule
**Tags**: None
## README
# agile-task : 任务调度组件
[](https://img.shields.io/badge/Spring-LATEST-green)
[](https://img.shields.io/badge/build-maven-green)
## 它有什么作用
* **持久化定时任务**
任务数据支持直接落入数据库,防止重启数据丢失,持久化防止支持自定义扩展
通过实现接口cloud.agileframework.task.TaskService,可以自定义持久化方式,
如落入MySQL、Redis、Oracle等。默认持久化方式为内存形式,内存形式不支持重启。
* **启动加载**
程序伴随spring应用启动时自动加载定时任务数据,无需人工干预
* **动态修改**
在程序运行过程中,支持通过restful api或自定义程序调用,动态添加、修改、删除定时任务 且不需要重启服务
* **周期时间任务**
支持spring cron表达式形式的周期性定时任务
* **固定时间点任务**
支持以时间戳为表达式的固定时间点任务,如仅需要执行一次的定时任务。
* **多表达式**
支持在一个定时任务中,输入多个固定或周期任务表达式,以英文分号分隔,则任务将同时识别
多表达式,针对同一个任务,避免了按不同周期或时间点创建多个任务定义的繁琐操作,也便于维护。
* **任务冲突**
任务冲突分应用级别冲突与表达式级别冲突: 应用级别冲突指在分布式或集群中,相同任务,在同一时刻时,触发多个应用程序同时执行任务调度,
此种情况下,agile-task提供加解锁接口,锁方式用户可根据实际场景自行定义,可直接使用redis锁实现,该锁于agile-cache组件中
提供,开箱即用。 表达式级别冲突指当同一个任务,定义`多表达式`
时,表达式之间会产生时间点重叠,agile-task会自动计算重叠时间点,且保证重叠时间点 仅运行一次的效果。
* **方法集与排序**
任务一般只捆绑一个程序中的方法,但agile-task也支持一个任务直接捆绑多个方法,且为捆绑的多个方法进行排序。
当任务执行时会按照定义的方法的排序顺序,依次执行捆绑的方法。
* **定义复杂任务参数**
支持为任务定义复杂参数,参数的内容将以json串的形式持久化,运行时翻译为任务所需类型参数,其中内置 两个常用参数标识符,作为特殊参数识别:
`$Task`:任务信息,当参数声明为该标识符时,任务执行过程直接以任务定义信息为参数调用定时任务方法。
`$TaskCode`:任务标识,当参数声明为该标识符时,任务执行过程直接以任务唯一标识为参数调用定时任务方法。
-------
## 快速入门
开始你的第一个项目是非常容易的。
#### 步骤 1: 下载包
您可以从[最新稳定版本]下载包(https://github.com/mydeathtrial/agile-task/releases). 该包已上传至maven中央仓库,可在pom中直接声明引用
以版本agile-task-2.1.0.M5.jar为例。
#### 步骤 2: 添加maven依赖
```xml
cent
https://repo1.maven.org/maven2/
cloud.agileframework
agile-task
2.1.0.M5
```
#### 步骤 3: 开箱即用
##### 组件开关
```
//组件加载开关,默认为`true`开启
agile.task.enable=true
//组件restful api加载开关,默认为`false`关闭
agile.task.controller.enable=true
```
##### restful方式动态添加任务
```
//以新建任务唯一标识为24,每秒执行一次的定时任务为例,直接调用接口,输入以下body参数
地址: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][开始执行]
...
```
##### restful方式动态启停
```
//以刚刚创建的任务24为例
停用地址:POST http://localhost:8080/task/24/false
启用地址:POST http://localhost:8080/task/24/true
```
##### restful方式查询
```
//以刚刚创建的任务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.agileframework.task.TaskService`
> 默认持久化方法:`cloud.agileframework.task.TaskServiceImpl`
##### 数据结构说明
**任务定义(`cloud.agileframework.task.Task`)**
```
public interface Task {
/**
* 取任务唯一标识
*
* @return 唯一标识
*/
Long getCode();
/**
* 取任务名字
*
* @return 任务名
*/
String getName();
/**
* 取cron表达式
*
* @return 定时任务表达式
*/
String getCron();
/**
* 是否集群同步
*
* @return 是否
*/
Boolean getSync();
/**
* 是否可用
*
* @return 是否
*/
Boolean getEnable();
/**
* 取任务目标标识
*
* @return 唯一标识
*/
Method getMethod();
/**
* 任务入参
*
* @return 字符串入参
*/
String getArgument();
}
```