# task-spring-boot-starter
**Repository Path**: chichengyu/task-spring-boot-starter
## Basic Information
- **Project Name**: task-spring-boot-starter
- **Description**: 自定义spring定时任务starter
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-07-25
- **Last Updated**: 2024-07-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# task-spring-boot-starter
## 介绍
自定义spring定时任务starter,sql可执行创建表。有两种使用方式:
- :heavy_check_mark: 方式1: [spring中的 TaskScheduler](#spring中的TaskScheduler) ` (持久化时执行 sql/job.sql) `
- :heavy_check_mark: 方式2: [Quartz 任务调度框架](#Quartz任务调度框架) ` (持久化时执行 sql/quartz.sql )`
- 其他工具类:[Excel工具类(集成)](https://gitee.com/chichengyu/task-spring-boot-starter/blob/master/EXCEL.md)
:warning:注:sql文件 ` job_task 任务表`/ ` job_task_log 任务日志表`,需要持久化的可以创建表,在添加任务的同时插入表中。
如果要查看任务` debug `日志,需要在项目配置文件` application.yml `配置
```
logging:
level:
com.job.task: debug
```
重启项目,可以看到控制台任务` debug `日志已经打印了。
#### 使用说明
最新版本``` 1.1.0.RELEASE ```
```
io.gitee.chichengyu
task-spring-boot-starter
1.1.0.RELEASE
```
:lollipop:使用很简单,项目里引入坐标
项目集成了 ` Quartz `,也支持:heart:[`spring自带的 TaskScheduler(使用时排除Quartz依赖`)](#spring中的TaskScheduler):heart:
```
io.gitee.chichengyu
task-spring-boot-starter
1.1.0.RELEASE
org.apache.poi
poi-ooxml
```
第1步:point_right::创建任务Bean类 ` TestTask `,需要实现接口 ` com.job.task.ITask `,多个定时器(`创建多个任务Bean类实现接口ITask`)
```
@Component("testTask")
public class TestTask implements ITask {
@Override
public R run(String params) {
System.out.println("测试定时任务执行了,参数:"+params);
try {
JobTask jobTask = JSON.parseObject(params, JobTask.class);
System.out.println(jobTask.toString());
// 逻辑处理...
return R.ok();
} catch (Exception e) {
// 会将异常信息记录到 JobTaskLog 的 message 成员属性中
return R.error(e.toString());
}
}
}
```
第2步:point_right::就是创建配置文件` TaskConfig `/` TaskQuartzConfig `与任务管理` TaskManager `/` TaskQuartzManager `,持久化都需要添加任务时插入 ` job_task 任务表 `/ ` job_task_log 任务日志表 `,只是不同的是 `Quartz`还有自己的表(不需要我们管),我们只需要关心` job_task 任务表 `/ ` job_task_log 任务日志表 `,需要我们记录到数据库。
第3步:point_right::就是参考下面2个使用方式,分别创建对应的配置文件` TaskConfig `/` TaskQuartzConfig `与任务管理` TaskManager `/` TaskQuartzManager `,进行增删改查。
### [spring中的TaskScheduler](#使用说明)
:pushpin: 引入依赖,:lollipop:排除多余的 ` Quartz 依赖`,
```
io.gitee.chichengyu
task-spring-boot-starter
1.1.0.RELEASE
org.springframework.boot
spring-boot-starter-quartz
org.apache.poi
poi-ooxml
```
一定要排除`Quartz依赖` ,虽然不影响,但总归使用项目更简洁
:lollipop:创建一个配置文件 ` TaskConfig.java `
```
@Configuration
public class TaskConfig {
@Autowired
private JobTaskLogDao jobTaskLogDao;// 保存到数据库,需自行实现,提供的 sql/JobTaskLogDao 表
@Bean
public TaskManager taskManager(){
// 不需要记录日志到数据库
TaskManager taskManager = new TaskManager();
taskManager.setPoolSize(5);
taskManager.setPrefix("task_");
taskManager.setErrorHandler(e -> {
log.error("执行异常:{}",e);
// 可以给管理者发送邮件 ...
});
taskManager.init();// 初始化
// 需要记录日志到数据库
/*TaskManager taskManager = new TaskManager(jobLog -> jobTaskLogDao.save(jobLog));// 保存定时任务日志到数据库中
taskManager.setPoolSize(5);
taskManager.setPrefix("task_");
taskManager.setErrorHandler(e -> {
log.error("执行异常:{}",e);
// 可以给管理者发送邮件 ...
});
//taskManager.setJobTaskLogSave(jobLog -> jobTaskLogDao.save(jobLog));//也可以这样设置
taskManager.init();// 初始化 */
return taskManager;
}
}
```
然后创建一个控制器 ` TestController `
```
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TaskManager taskManager;
@Autowired
private JobTaskDao jobTaskDao;
@GetMapping("/task/add")
public String add() {
JobTask jobTask = new JobTask();
jobTask.setBeanName("testTask");// TestTask 类的 BeanName名称
jobTask.setJobId(100L);
jobTask.setStatus(0);// 0正常1禁止 JobTaskLog 日志的 status 0代表定时任务运行结果成功 1失败
jobTask.setParams("我是测试定时器");
jobTask.setCron("*/2 * * * * ?");
jobTask.setRemark("测试");
jobTask.setCreateTime(new Date());
jobTaskDao.save(jobTask);// 同时持久化保存到自定义的 job_task 表中
taskManager.addCronTask(jobTask);
// taskManager.updateCronTask(jobTask);// 更新任务
// taskManager.runNow(jobTask);// 立即执行
// taskManager.cancel(jobTask.getJobId());// 取消任务
// taskManager.refresh();// 批量添加任务
// 正在运行的任务
// ConcurrentHashMap taskContainer = taskManager.getTaskContainer();
return "ok";
}
}
```
然后启动项目,访问接口,即可看到定时任务执行。
### [Quartz任务调度框架](#使用说明)
引包
```
io.gitee.chichengyu
task-spring-boot-starter
1.1.0.RELEASE
org.apache.poi
poi-ooxml
```
:pushpin: 创建一个配置文件 ` TaskQuartzConfig.java `
###### 基本使用配置
```
@Slf4j
@Configuration
public class TaskConfig {
/**
* 创建一个 TaskQuartzManager 用于管理任务
* @return
*/
@Bean
public TaskQuartzManager taskQuartzManager(SchedulerFactoryBean schedulerFactoryBean){
// 把任务日志保存到数据库
//TaskQuartzManager taskQuartzManager = new TaskQuartzManager(jobTaskLog -> jobTaskLogDao.save(jobTaskLog));
TaskQuartzManager taskQuartzManager = new TaskQuartzManager();
taskQuartzManager.setSchedulerFactoryBean(schedulerFactoryBean);
taskQuartzManager.setJobTaskLogSave(jobTaskLog -> log.info("日志,[{}]",JsonUtil.toJson(jobTaskLog)));// 此处可以把任务日志保存到数据库
//taskQuartzManager.setJobNamePrefix("aaaa_");// 可设置任务名称前缀
taskQuartzManager.init();// 初始化
return taskQuartzManager;
}
}
```
###### 持久化配置(不需要则不配置)
```
@Slf4j
@Configuration
public class TaskQuartzConfig {
@Autowired
private JobTaskLogDao jobTaskLogDao;// 保存到数据库,需自行实现,提供的 sql/JobTaskLogDao 表
/**
* 必须创建一个 SchedulerFactoryBean 加入到spring容器
* Quartz 的持久化配置也可以在处配置
* @return
*/
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
//public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource){
// 默认内存方式 org.quartz.simpl.RAMJobStore
SchedulerFactoryBean factoryBean = TaskQuartzManager.getSchedulerFactoryBean();
/* 可选,默认在 TaskQuartzManager.getSchedulerFactoryBean() 中已经进行配置了
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "TaskScheduler");// 可自定义
prop.put("org.quartz.scheduler.instanceId", "AUTO");// 可自定义
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");// 可自定义
prop.put("org.quartz.threadPool.threadCount", "20");// 可自定义线程
prop.put("org.quartz.threadPool.threadPriority", "5");// 可自定义
factoryBean.setQuartzProperties(prop);*/
factoryBean.setStartupDelay(5);// 项目启动后5s后开始执行任务
/*// 这是笔者项目中使用的持久化配置
//SchedulerFactoryBean factory = TaskQuartzManager.getSchedulerFactoryBean();//也可进行覆盖设置
SchedulerFactoryBean factory = new SchedulerFactoryBean();
factory.setDataSource(dataSource);
//quartz参数
Properties prop = new Properties();
prop.put("org.quartz.scheduler.instanceName", "TaskScheduler");
prop.put("org.quartz.scheduler.instanceId", "AUTO");
//线程池配置
prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
prop.put("org.quartz.threadPool.threadCount", "20");
prop.put("org.quartz.threadPool.threadPriority", "5");
//JobStore配置
//quartz版本不同可能此配置也不同,如启动报错(就是此配置原因):org.quartz.SchedulerConfigException: DataSource name not set
//prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX");
prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
//集群配置
prop.put("org.quartz.jobStore.isClustered", "false");// 集群时一定要设置为 true
prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
prop.put("org.quartz.jobStore.misfireThreshold", "12000");
prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
//PostgreSQL数据库,需要打开此注释
//prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
factory.setQuartzProperties(prop);
factory.setSchedulerName("TaskScheduler");
//延时启动
factory.setStartupDelay(30);
factory.setApplicationContextSchedulerContextKey("applicationContextKey");
//可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
factory.setOverwriteExistingJobs(true);
//设置自动启动,默认为true
factory.setAutoStartup(true);*/
return factoryBean;
}
/**
* 创建一个 TaskQuartzManager 用于管理任务
* @return
*/
@Bean
public TaskQuartzManager taskQuartzManager(SchedulerFactoryBean schedulerFactoryBean){
// 把任务日志保存到数据库
//TaskQuartzManager taskQuartzManager = new TaskQuartzManager(jobTaskLog -> jobTaskLogDao.save(jobTaskLog));
TaskQuartzManager taskQuartzManager = new TaskQuartzManager();
taskQuartzManager.setSchedulerFactoryBean(schedulerFactoryBean);
taskQuartzManager.setJobTaskLogSave(jobTaskLog -> log.info("日志,[{}]",jobTaskLog));// 此处可以把任务日志保存到数据库
//taskQuartzManager.setJobNamePrefix("aaaa_");// 可设置任务名称前缀
taskQuartzManager.init();// 初始化
return taskQuartzManager;
}
}
```
然后创建一个控制器 ` TestController `添加任务与上面一样。
```
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TaskQuartzManager taskQuartzManager;
@Autowired
private JobTaskDao jobTaskDao;
@GetMapping("/task/add")
public String add() {
JobTask jobTask = new JobTask();
jobTask.setBeanName("testTask");// TestTask 类的 BeanName名称
jobTask.setJobId(100L);
jobTask.setStatus(0);// 0正常1禁止 JobTaskLog 日志的 status 0代表定时任务运行结果成功 1失败
jobTask.setParams("我是测试定时器");
jobTask.setCron("*/2 * * * * ?");
jobTask.setRemark("测试");
jobTask.setCreateTime(new Date());
taskQuartzManager.addCronTask(jobTask);
jobTaskDao.save(jobTask);// 同时持久化保存到自定义的 job_task 表中
return "ok";
}
}
```
启动项目,可以看到定时任务启动了。