From d03b8cdd891531f7c46589e0a24e67a4aa60d7ec Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 07:04:11 +0000
Subject: [PATCH 01/14] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E5=BC=80=E5=90=AF?=
=?UTF-8?q?=E6=B3=A8=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../container/components/redis/ApplicationConfiguration.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/redis-component/src/main/java/com/gcc/container/components/redis/ApplicationConfiguration.java b/redis-component/src/main/java/com/gcc/container/components/redis/ApplicationConfiguration.java
index c181c76..98c4ba0 100644
--- a/redis-component/src/main/java/com/gcc/container/components/redis/ApplicationConfiguration.java
+++ b/redis-component/src/main/java/com/gcc/container/components/redis/ApplicationConfiguration.java
@@ -2,8 +2,9 @@ package com.gcc.container.components.redis;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
-
+import org.springframework.cache.annotation.EnableCaching;
@Configuration
+@EnableCaching
@ComponentScan(basePackages = "com.gcc.container.components.redis.*")
public class ApplicationConfiguration {
}
--
Gitee
From daab27ae526ab4ac58b25b70915aa97fcc227be5 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:54:07 +0000
Subject: [PATCH 02/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/README.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
task-component/README.md | 333 ---------------------------------------
1 file changed, 333 deletions(-)
delete mode 100644 task-component/README.md
diff --git a/task-component/README.md b/task-component/README.md
deleted file mode 100644
index eb4143d..0000000
--- a/task-component/README.md
+++ /dev/null
@@ -1,333 +0,0 @@
-# task-component
-
-> 相比于SpringBoot本身自带的定时任务注解的死板(程序一旦运行,无法更改定时任务执行周期、相关配置等问题)和xxl-Job的笨重,该组件从代码级提供了轻量级的定时任务管理解决方案
->
-> 引入该组件,只需要实现定时任务基类,即可完成自动注册定时任务,通过定时任务接口来动态控制任务的状态,使用接口配合页面,可扩展到页面功能,做到随时启停、修改定时任务
-
-## 组件依赖说明
-
-组件整体继承自Components包,所依赖Spring相关组件及通用的公共组件依赖跟随Components版本进行调整管控,相关内容可查看Components的README文档
-
-```xml
-
- com.gcc.container
- components
- 1.0.0
-
-```
-
-除基本的SpringAOP、autoconfigure外无其他依赖
-
-## 使用说明
-
-找到对应版本的Components源码,下载到本地,本地编译安装到私仓中,在你的项目中引入:
-
-```xml
-
-
- com.gcc.container.components
- task-component
- 1.0.0
-
-```
-
-### yaml配置
-
-因该组件是基于包扫描去识别定时任务类和默认以JSON文件的形式去存储项目的定时任务信息,需要通过yaml配置文件来指定包路径和文件的存放路径,引入组件后,可在自己的yml文件中追加:
-
-```yml
-gcc-task:
- #指定定时任务存放的包路径,默认不填写则扫描全项目
- task-class-package : *
- #定时任务管理的数据存放文件及其路径,默认不填写则存放项目运行目录下,如自行扩展实现,则该配置自动失效
- data-file-path: /opt/myproject/task_info.json
-```
-
-此处的两个配置项都包含默认值,所以不进行yml的`gcc-task`仍旧可以使用该组件
-
-### 新建定时任务
-
-引入依赖后,需要新增一个定时任务逻辑,则需要实现基类`AbstractBaseCronTask` ,并加入注解 `@TaskJob`
-
-**TaskJob的参数如下**:
-
-| 参数 | 说明 | 样例 |
-| ------ | --------------------------------------------- | -------------- |
-| cron | 定时任务默认的执行周期,仅在首次初始化该任务使用(**必填**) | 10 0/2 * * * ? |
-| desc | 任务描述,非必填 | 这是测试任务 |
-| bootup | 是否开机自启动,**缺省值为 false** | false |
-
-*`cron` 属性仅在第一次新增该任务时提供一个默认的执行周期,必须填写,后续任务加载后,定时任务相关数据会被存放在文件或数据库中,此时则以文件或数据库中该任务的cron为主*
-
-完整一个定时任务demo如下:
-
-```java
-@TaskJob(cron = "10 0/2 * * * ?" ,desc = "这是一个测试任务",bootup = true)
-public class TaskMysqlOne extends AbstractBaseCronTask {
-
- public TaskMysqlOne(TaskEntity taskEntity) {
- super(taskEntity);
- }
-
- @Override
- public void beforeJob() {
- }
-
- @Override
- public void startJob() {
- }
-
- @Override
- public void afterJob() {
- }
-}
-```
-
-继承`AbstractBaseCronTask` 必须要实现携带TaskEntity参数的`构造函数`、`beforeJob()`、`startJob()` 、`afterJob()` 三个方法即可。**原则上这三个方法是规范定时任务的执行,实际使用,只需要把核心逻辑放在三个方法中任何一个即可**。
-
-
-
-因定时任务类是非SpringBean管理的类,所以**在自定义的定时任务类内无法使用任何Spring相关的注解(如@Autowired)**,**但是却可以通过自带的**`getServer(Class className)`**方法来获取任何Spring上下文中的Bean**
-
-例如,你有一个UserService的接口及其Impl的实现类
-
-```java
-@TaskJob(cron = "10 0/2 * * * ?" ,desc = "这是一个测试任务",bootup = true)
-public class TaskMysqlOne extends AbstractBaseCronTask {
-
- public TaskMysqlOne(TaskEntity taskEntity) {
- super(taskEntity);
- }
-
- @Override
- public void beforeJob() {
- }
-
- @Override
- public void startJob() {
- List names = getServer(UserService.class).searchAllUserName();
- //后续逻辑……
- //其他逻辑
- }
-
- @Override
- public void afterJob() {
-
- }
-}
-```
-
-### 服务接口说明
-
-定时任务相关的管理操作均封装在`TaskScheduleManagerService`接口中,可直接在外部项目中注入使用即可:
-
-```java
-@RestController
-@RequestMapping("/myself/manage")
-public class TaskSchedulingController {
-
- @Autowired
- TaskScheduleManagerService taskScheduleManagerService;
-
- @GetMapping("/detail")
- @Operation(summary = "具体任务对象")
- public Response searchDetail(String taskId){
- return Response.success(taskScheduleManagerService.searchTaskDetail(taskId));
- }
-
- @GetMapping("/shutdown")
- @Operation(summary = "关闭指定任务")
- public Response shutdownTask(String taskId){
- return Response.success(taskScheduleManagerService.shutdownTask(taskId));
- }
-
- @GetMapping("/open")
- @Operation(summary = "开启指定任务")
- public Response openTask(String taskId){
- return Response.success(taskScheduleManagerService.openTask(taskId));
- }
-
-```
-
-`TaskScheduleManagerService`的接口定义如下:
-
-```java
-public interface TaskScheduleManagerService {
- /**
- * 查询在用任务
- * @return
- */
- List searchTask(SearchTaskDto dto);
- /**
- * 查询任务详情
- * @param taskId 任务id
- * @return TaskEntity
- */
- TaskVo searchTaskDetail(String taskId);
- /**
- * 运行指定任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo runTask(String taskId);
- /**
- * 关停任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo shutdownTask(String taskId);
- /**
- * 开启任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo openTask(String taskId);
- /**
- * 更新任务信息
- * @param entity 实体
- * @return TaskRunRetDto
- */
- TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity);
-}
-```
-
-## 扩展说明
-
-定时任务类首次新增被扫描后,会以TaskEntity的形式存在于内存中,TaskEntity如下:
-
-```java
-@Data
-public class TaskEntity implements Serializable {
-
- private String taskId;
-
- private String taskName;
-
- private String taskDesc;
-
- private String taskCron;
-
- private String taskClass;
-
- /**
- * 任务相关配置
- */
- private String taskOutConfig;
-
- /**
- * 任务注册时间
- */
- private String taskCreateTime;
-
- /**
- * 是否启用
- */
- private Integer taskIsUse;
-
- /**
- * 是否开启自启动
- */
- private Integer taskBootUp;
-
- /**
- * 上次运行状态
- */
- private Integer taskLastRun;
-
- /**
- * 任务是否在内存中
- */
- private Integer taskRamStatus;
-```
-
-task-component会将内存中的TaskEntity进行持久化,下次再启动项目时,则直接使用持久化的TaskEntity来加载定时任务,task-component默认是以JSON文件进行持久化,实际使用中为了能带来更好的体验,建议扩展为数据库存储,扩展方式如下:
-
-1、新建数据库表(以Mysql为例)
-
-```SQL
-DROP TABLE IF EXISTS `tb_task_info`;
-CREATE TABLE `tb_task_info` (
- `task_id` varchar(100) NOT NULL PRIMARY KEY ,
- `task_name` varchar(255) DEFAULT NULL,
- `task_desc` text,
- `task_cron` varchar(20) DEFAULT NULL,
- `task_class` varchar(100) DEFAULT NULL COMMENT '定时任务类路径',
- `task_is_use` tinyint DEFAULT NULL COMMENT '是否启用该任务,1:启用,0禁用',
- `task_boot_up` tinyint DEFAULT NULL COMMENT '是否为开机即运行,1:初始化即运行,0,初始化不运行',
- `task_out_config` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '定时任务额外配置项,采用json结构存放',
- `task_create_time` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '定时任务追加时间',
- `task_last_run` tinyint DEFAULT NULL COMMENT '任务上次执行状态;1正常,0执行失败,null未知',
- `task_ram_status` tinyint DEFAULT NULL COMMENT '任务当前状态;1内存运行中,0内存移除',
- PRIMARY KEY (`task_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
-```
-
-2、项目中实现`TaskRepository`接口,并使用@Primary注解:
-
-```java
-@Repository
-@Primary
-public class TaskRepositoryImpl implements TaskRepository {
-
- @Autowired
- private TaskDataMapper taskDataMapper;
-
- @Override
- public int save(TaskEntity entity) {
- entity.setTaskCreateTime(DateUtil.now());
- return taskDataMapper.insert(entity);
- }
-
- @Override
- public int update(TaskEntity entity) {
- UpdateWrapper update = new UpdateWrapper<>();
- update.eq("task_id",entity.getTaskId());
- return taskDataMapper.update(entity,update);
- }
-
-
- @Override
- public int removeByTaskId(String id) {
- QueryWrapper query = new QueryWrapper<>();
- query.eq("task_id",id);
- return taskDataMapper.delete(query);
- }
-
- @Override
- public List queryAllTask() {
- return taskDataMapper.selectList(new QueryWrapper<>());
- }
-
- @Override
- public TaskEntity queryData(String id) {
- QueryWrapper query = new QueryWrapper<>();
- query.eq("task_id",id);
- return taskDataMapper.selectOne(query);
- }
-
- @Override
- public List queryData(TaskEntity entity) {
- QueryWrapper query = new QueryWrapper<>();
- query.orderByAsc("task_create_time");
- if(null != entity) {
- if (null != entity.getTaskIsUse()) {
- query.eq("task_is_use", entity.getTaskIsUse());
- }
- if (null != entity.getTaskBootUp()) {
- query.eq("task_boot_up", entity.getTaskBootUp());
- }
- if (!StringUtils.isEmpty(entity.getTaskDesc())) {
- query.like("task_desc", entity.getTaskDesc());
- }
- }
- return taskDataMapper.selectList(query);
- }
-}
-
-```
-
-
-
-只需要实现其中指定的几个持久化和查询方法即可替换component中的JSON文件持久化
-
-
--
Gitee
From 61aa24b094d423d17663c4741b9227c01f07e377 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:54:30 +0000
Subject: [PATCH 03/14] =?UTF-8?q?=E6=9B=B4=E6=96=B0README=E6=96=87?=
=?UTF-8?q?=E6=A1=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
task-component/README.md | 467 +++++++++++++++++++++++++++++++++++++++
1 file changed, 467 insertions(+)
create mode 100644 task-component/README.md
diff --git a/task-component/README.md b/task-component/README.md
new file mode 100644
index 0000000..9f65f24
--- /dev/null
+++ b/task-component/README.md
@@ -0,0 +1,467 @@
+# task-component
+
+> 相比于SpringBoot本身自带的定时任务注解的死板(程序一旦运行,无法更改定时任务执行周期、相关配置等问题)和xxl-Job的笨重,该组件从代码级提供了轻量级的定时任务管理解决方案
+>
+> 引入该组件,即可完成自动注册定时任务,通过定时任务接口来动态控制任务的状态,使用接口配合页面,可扩展到页面功能,做到随时启停、修改定时任务
+
+## 组件依赖说明
+
+组件整体继承自Components包,所依赖Spring相关组件及通用的公共组件依赖跟随Components版本进行调整管控,相关内容可查看Components的README文档
+
+```xml
+
+ com.gcc.container
+ components
+ 1.0.0
+
+```
+
+除基本的SpringAOP、autoconfigure外无其他依赖
+
+## 使用说明
+
+找到对应版本的Components源码,下载到本地,本地编译安装到私仓中,在你的项目中引入:
+
+```xml
+
+
+ com.gcc.container.components
+ task-component
+ 1.0.0
+
+```
+
+### yaml配置
+
+因该组件是基于包扫描去识别定时任务类和默认以JSON文件的形式去存储项目的定时任务信息,需要通过yaml配置文件来指定包路径和文件的存放路径,引入组件后,可在自己的yml文件中追加:
+
+```yml
+gcc-task:
+ #指定定时任务存放的包路径,默认不填写则扫描全项目
+ task-class-package : *
+ #定时任务管理的数据存放文件及其路径,默认不填写则存放项目运行目录下,如自行扩展实现,则该配置自动失效
+ data-file-path: /opt/myproject/task_info.json
+```
+
+此处的两个配置项都包含默认值,所以不进行yml的`gcc-task`仍旧可以使用该组件
+
+### 新建定时任务
+
+#### 类级定时任务
+
+引入依赖后,需要新增一个定时任务逻辑,则需要实现基类`AbstractBaseCronTask` ,并加入注解 `@ClassJob`
+
+**ClassJob的参数如下**:
+
+| 参数 | 说明 | 样例 |
+| ------ | --------------------------------------------- | -------------- |
+| cron | 定时任务默认的执行周期,仅在首次初始化该任务使用(**必填**) | 10 0/2 * * * ? |
+| desc | 任务描述,非必填 | 这是测试任务 |
+| bootup | 是否开机自启动,**缺省值为 false** | false |
+
+*`cron` 属性仅在第一次新增该任务时提供一个默认的执行周期,必须填写,后续任务加载后,定时任务相关数据会被存放在文件或数据库中,此时则以文件或数据库中该任务的cron为主*
+
+完整一个定时任务demo如下:
+
+```java
+@TaskJob(cron = "10 0/2 * * * ?" ,desc = "这是一个测试任务",bootup = true)
+public class TaskMysqlOne extends AbstractBaseCronTask {
+
+ public TaskMysqlOne(TaskEntity taskEntity) {
+ super(taskEntity);
+ }
+
+ @Override
+ public void beforeJob() {
+ }
+
+ @Override
+ public void startJob() {
+ }
+
+ @Override
+ public void afterJob() {
+ }
+}
+```
+
+继承`AbstractBaseCronTask` 必须要实现携带TaskEntity参数的`构造函数`、`beforeJob()`、`startJob()` 、`afterJob()` 三个方法即可。**原则上这三个方法是规范定时任务的执行,实际使用,只需要把核心逻辑放在三个方法中任何一个即可**。
+
+因定时任务类是非SpringBean管理的类,所以**在自定义的定时任务类内无法使用任何Spring相关的注解(如@Autowired)**,**但是却可以通过自带的**`getServer(Class className)`**方法来获取任何Spring上下文中的Bean**
+
+例如,你有一个UserService的接口及其Impl的实现类
+
+```java
+@TaskJob(cron = "10 0/2 * * * ?" ,desc = "这是一个测试任务",bootup = true)
+public class TaskMysqlOne extends AbstractBaseCronTask {
+
+ public TaskMysqlOne(TaskEntity taskEntity) {
+ super(taskEntity);
+ }
+
+ @Override
+ public void beforeJob() {
+ }
+
+ @Override
+ public void startJob() {
+ List names = getServer(UserService.class).searchAllUserName();
+ //后续逻辑……
+ //其他逻辑
+ }
+
+ @Override
+ public void afterJob() {
+
+ }
+}
+```
+
+#### 方法级别定时任务
+
+如果不想使用繁琐的类任务,想像xxl-job一样通过注解指定某个方法为定时执行,则可以使用方法级别的定时任务定义,具体使用方式为`@MethodJob`注解对Bean上的方法进行标注,则可以进行定时任务注册:
+
+**MethodJob的参数如下**:
+
+| 参数 | 说明 | 样例 |
+| ------ | -------------------------------- | -------------- |
+| cron | 定时任务默认的执行周期,仅在首次初始化该任务使用(**必填**) | 10 0/2 * * * ? |
+| desc | 任务描述,非必填 | 这是测试任务 |
+| bootup | 是否开机自启动,**缺省值为 false** | false |
+
+*`cron` 属性仅在第一次新增该任务时提供一个默认的执行周期,必须填写,后续任务加载后,定时任务相关数据会被存放在文件或数据库中,此时则以文件或数据库中该任务的cron为主
+
+```java
+//正常定义的Service接口
+public interface AsyncTestService {
+ void taskJob();
+
+}
+
+//Service接口实现类
+@Service
+public class AsyncTestServiceImpl implements AsyncTestService {
+
+ @MethodJob(cron = "11 0/1 * * * ?",desc = "这是个方法级任务")
+ @Override
+ public void taskJob() {
+ log.info("方法级别任务查询关键字为企业的数据");
+ QueryWrapper query = new QueryWrapper<>();
+ query.like("art_name","企业");
+ List data = articleMapper.selectList(query);
+ log.info("查出条数为{}",data.size());
+ }
+}
+```
+
+**该注解仅支持SpringBoot中标注为`@Component`、`@Service`、`@Repository`的Bean**
+
+
+
+运行效果:
+
+```shell
+[main] com.web.test.Application : Started Application in 3.567 seconds (JVM running for 4.561)
+[main] .g.c.c.t.c.InitTaskSchedulingApplication : 【定时任务初始化】 容器初始化
+[main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService
+[main] .g.c.c.t.c.InitTaskSchedulingApplication : 【定时任务初始化】定时任务初始化任务开始
+[main] c.g.c.c.task.compont.TaskScheduleImpl : 【定时任务初始化】装填任务:TaskTwoPerson [ 任务执行周期:15 0/2 * * * ? ] [ bootup:0]
+[main] c.g.c.c.task.compont.TaskScheduleImpl : 【定时任务初始化】装填任务:TaskMysqlOne [ 任务执行周期:10 0/2 * * * ? ] [ bootup:1]
+[main] c.g.c.c.task.compont.TaskScheduleImpl : 【定时任务初始化】装填任务:taskJob [ 任务执行周期:11 0/1 * * * ? ] [ bootup:0]
+[main] .g.c.c.t.c.InitTaskSchedulingApplication : 【定时任务初始化】定时任务初始化任务完成
+[main] c.g.c.c.task.service.AfterAppStarted : 【定时任务自运行】运行开机自启动任务
+[main] TaskMysqlOne : ---------------------任务 TaskMysqlOne 开始执行-----------------------
+[main] TaskMysqlOne : 任务描述:这是一个测试任务
+[main] TaskMysqlOne : 我是张三
+[main] TaskMysqlOne : 任务耗时:约 0.0 s
+[main] TaskMysqlOne : ---------------------任务 TaskMysqlOne 结束执行-----------------------
+
+[task-thread-1] taskJob : ---------------------任务 taskJob 开始执行-----------------------
+[task-thread-1] taskJob : 任务描述:这是个方法级任务
+[task-thread-1] c.w.t.service.impl.AsyncTestServiceImpl : 方法级别任务查询关键字为企业的数据
+[task-thread-1] c.w.t.service.impl.AsyncTestServiceImpl : 查出条数为1
+[task-thread-1] taskJob : 任务耗时:约 8.45 s
+[task-thread-1] taskJob : ---------------------任务 taskJob 结束执行-----------------------
+
+
+```
+
+### 服务接口说明
+
+定时任务相关的管理操作均封装在`TaskScheduleManagerService`接口中,可直接在外部项目中注入使用即可:
+
+```java
+@RestController
+@RequestMapping("/myself/manage")
+public class TaskSchedulingController {
+
+ @Autowired
+ TaskScheduleManagerService taskScheduleManagerService;
+
+ @GetMapping("/detail")
+ @Operation(summary = "具体任务对象")
+ public Response searchDetail(String taskId){
+ return Response.success(taskScheduleManagerService.searchTaskDetail(taskId));
+ }
+
+ @GetMapping("/shutdown")
+ @Operation(summary = "关闭指定任务")
+ public Response shutdownTask(String taskId){
+ return Response.success(taskScheduleManagerService.shutdownTask(taskId));
+ }
+
+ @GetMapping("/open")
+ @Operation(summary = "开启指定任务")
+ public Response openTask(String taskId){
+ return Response.success(taskScheduleManagerService.openTask(taskId));
+ }
+```
+
+`TaskScheduleManagerService`的接口定义如下:
+
+```java
+public interface TaskScheduleManagerService {
+ /**
+ * 查询在用任务
+ * @return
+ */
+ List searchTask(SearchTaskDto dto);
+ /**
+ * 查询任务详情
+ * @param taskId 任务id
+ * @return TaskEntity
+ */
+ TaskVo searchTaskDetail(String taskId);
+ /**
+ * 运行指定任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo runTask(String taskId);
+ /**
+ * 关停任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo shutdownTask(String taskId);
+ /**
+ * 开启任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo openTask(String taskId);
+ /**
+ * 更新任务信息
+ * @param entity 实体
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity);
+}
+```
+
+## 扩展说明
+
+定时任务类首次新增被扫描后,会以TaskEntity的形式存在于内存中,TaskEntity如下:
+
+```java
+@Data
+public class TaskEntity implements Serializable {
+
+ /**
+ * 任务ID(唯一)
+ */
+ private String taskId;
+
+ /**
+ * 任务名称
+ */
+ private String taskName;
+
+ /**
+ * 任务描述
+ */
+ private String taskDesc;
+
+ /**
+ * 遵循cron 表达式
+ */
+ private String taskCron;
+
+ /**
+ * 类路径
+ */
+ private String taskClass;
+
+ /**
+ * 任务级别 CLASS_LEVEL 类级别,METHOD_LEVEL 方法级别
+ */
+ private TaskLevel taskLevel;
+
+ /**
+ * 任务注册时间
+ */
+ private String taskCreateTime;
+ /**
+ * 是否启用,1启用,0不启用
+ */
+ private Integer taskIsUse;
+
+ /**
+ * 是否系统启动后立刻运行 1是。0否
+ */
+ private Integer taskBootUp;
+
+ /**
+ * 上次运行状态 1:成功,0:失败
+ */
+ private Integer taskLastRun;
+ /**
+ * 任务是否在内存中 1:是,0:否
+ */
+ private Integer taskRamStatus;
+
+ /**
+ * 外部配置 (扩展待使用字段)
+ */
+ private String taskOutConfig;
+
+ /**
+ * 加载配置
+ */
+ private String loadConfigure;
+```
+
+task-component会将内存中的TaskEntity进行持久化,下次再启动项目时,则直接使用持久化的TaskEntity来加载定时任务,task-component默认是以JSON文件进行持久化,实际使用中为了能带来更好的体验,建议扩展为数据库存储,扩展方式如下:
+
+1、基于**TaskEntity类** 新建数据库表(以Mysql为例)
+
+```SQL
+DROP TABLE IF EXISTS `tb_task_info`;
+CREATE TABLE `tb_task_info` (
+ `task_id` varchar(100) NOT NULL PRIMARY KEY ,
+ `task_name` varchar(255) DEFAULT NULL,
+ `task_desc` text,
+ `task_cron` varchar(20) DEFAULT NULL,
+ `task_class` varchar(100) DEFAULT NULL COMMENT '定时任务类路径',
+ `task_level` varchar(50) DEFAULT NULL COMMENT '任务级别:类级别(CLASS_LEVEL)、方法级别(METHOD_LEVEL)',
+ `task_is_use` tinyint DEFAULT NULL COMMENT '是否启用该任务,1:启用,0禁用',
+ `task_boot_up` tinyint DEFAULT NULL COMMENT '是否为开机即运行,1:初始化即运行,0,初始化不运行',
+ `task_out_config` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci COMMENT '定时任务额外配置项,采用json结构存放',
+ `task_create_time` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '定时任务追加时间',
+ `task_last_run` tinyint DEFAULT NULL COMMENT '任务上次执行状态;1正常,0执行失败,null未知',
+ `task_ram_status` tinyint DEFAULT NULL COMMENT '任务当前状态;1内存运行中,0内存移除',
+ `loadConfigure` text COMMENT '加载相关配置',
+PRIMARY KEY (`task_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
+```
+
+2、项目中实现`TaskRepository`接口,并使用@Primary注解:
+
+TaskRepository接口如下:
+
+```java
+public interface TaskRepository {
+ /**
+ * 新增数据,必须保证entity每个字段都插入
+ * @param entity
+ * @return int
+ */
+ int save(TaskEntity entity);
+ /**
+ * 根据TaskId删除整条数据
+ * @param id id
+ * @return int
+ */
+ int removeByTaskId(String id);
+ /**
+ * 更新整个任务(除taskId外,其他字段数据均根据实体更新)
+ * @param entity 实体
+ * @return int
+ */
+ int update(TaskEntity entity);
+ /**
+ * 查询全部任务
+ * @return List
+ */
+ List queryAllTask();
+
+ /**
+ * 查询数据:根据实体中的字段进行查询
+ * @param entity 查询
+ * @return TaskEntity
+ */
+ List queryData(TaskEntity entity);
+
+ /**
+ * 查询具体的任务实体
+ * @param taskId 任务id
+ * @return TaskEntity
+ */
+ TaskEntity queryData(String taskId);
+}
+```
+
+
+
+
+
+3.基于Mybatis-Plus的实现Demo
+
+```java
+@Mapper
+public interface TaskDataMapper extends BaseMapper {
+}
+
+@Repository
+@Primary
+public class TaskRepositoryImpl implements TaskRepository {
+ @Autowired
+ private TaskDataMapper taskDataMapper;
+ @Override
+ public int save(TaskEntity entity) {
+ entity.setTaskCreateTime(DateUtil.now());
+ return taskDataMapper.insert(entity);
+ }
+ @Override
+ public int update(TaskEntity entity) {
+ UpdateWrapper update = new UpdateWrapper<>();
+ update.eq("task_id",entity.getTaskId());
+ return taskDataMapper.update(entity,update);
+ }
+ @Override
+ public int removeByTaskId(String id) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("task_id",id);
+ return taskDataMapper.delete(query);
+ }
+ @Override
+ public List queryAllTask() {
+ return taskDataMapper.selectList(new QueryWrapper<>());
+ }
+ @Override
+ public TaskEntity queryData(String id) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("task_id",id);
+ return taskDataMapper.selectOne(query);
+ }
+ @Override
+ public List queryData(TaskEntity entity) {
+ QueryWrapper query = new QueryWrapper<>();
+ query.orderByAsc("task_create_time");
+ if(null != entity) {
+ if (null != entity.getTaskIsUse()) {
+ query.eq("task_is_use", entity.getTaskIsUse());
+ }
+ if (null != entity.getTaskBootUp()) {
+ query.eq("task_boot_up", entity.getTaskBootUp());
+ }
+ if (!StringUtils.isEmpty(entity.getTaskDesc())) {
+ query.like("task_desc", entity.getTaskDesc());
+ }
+ }
+ return taskDataMapper.selectList(query);
+ }
+}
+```
+
+只需要实现其中指定的几个持久化和查询方法即可替换component中的JSON文件持久化
--
Gitee
From 6597d93a66c73d34e0f19b1aff1e2e7088352c23 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:54:52 +0000
Subject: [PATCH 04/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/an?=
=?UTF-8?q?notation?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/task/annotation/TaskJob.java | 19 -------------------
1 file changed, 19 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/annotation/TaskJob.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/annotation/TaskJob.java b/task-component/src/main/java/com/gcc/container/components/task/annotation/TaskJob.java
deleted file mode 100644
index 39a90f8..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/annotation/TaskJob.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.gcc.container.components.task.annotation;
-
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target(ElementType.TYPE)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface TaskJob {
-
- String desc() default "暂无描述";
-
- String cron() default "00 00 00 * * ?";
-
- boolean bootup() default false;
-
-}
\ No newline at end of file
--
Gitee
From ac6f3e2091eb4936af488f2db7ebc53ccd444565 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:55:23 +0000
Subject: [PATCH 05/14] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=96=B9=E6=B3=95?=
=?UTF-8?q?=E7=BA=A7=E5=88=AB=E6=B3=A8=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../components/task/annotation/ClassJob.java | 19 +++++++++++++++++
.../components/task/annotation/MethodJob.java | 21 +++++++++++++++++++
2 files changed, 40 insertions(+)
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/annotation/ClassJob.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/annotation/MethodJob.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/annotation/ClassJob.java b/task-component/src/main/java/com/gcc/container/components/task/annotation/ClassJob.java
new file mode 100644
index 0000000..cabefce
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/annotation/ClassJob.java
@@ -0,0 +1,19 @@
+package com.gcc.container.components.task.annotation;
+
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ClassJob {
+
+ String desc() default "暂无描述";
+
+ String cron() default "00 00 00 * * ?";
+
+ boolean bootup() default false;
+
+}
\ No newline at end of file
diff --git a/task-component/src/main/java/com/gcc/container/components/task/annotation/MethodJob.java b/task-component/src/main/java/com/gcc/container/components/task/annotation/MethodJob.java
new file mode 100644
index 0000000..b04e463
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/annotation/MethodJob.java
@@ -0,0 +1,21 @@
+package com.gcc.container.components.task.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 定时任务方法
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MethodJob {
+
+ String desc() default "暂无描述";
+
+ String cron() default "00 00 00 * * ?";
+
+ boolean bootup() default false;
+
+}
--
Gitee
From 5b299247e2ba42cf6850eb77beeb76dfa3c95d30 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:55:37 +0000
Subject: [PATCH 06/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/co?=
=?UTF-8?q?mpont?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../task/compont/AbstractBaseCronTask.java | 111 ------------
.../InitTaskSchedulingApplication.java | 48 ------
.../components/task/compont/TaskSchedule.java | 62 -------
.../task/compont/TaskScheduleImpl.java | 160 ------------------
.../task/compont/TaskTempFactory.java | 99 -----------
5 files changed, 480 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskTempFactory.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java b/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
deleted file mode 100644
index 7264f39..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.gcc.container.components.task.compont;
-
-
-import cn.hutool.core.util.NumberUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import com.gcc.container.components.task.dao.TaskRepository;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
-
-/**
- * 抽象定时任务类
- * 实现定时任务需要继承该类
- * 子类实现时,不要使用Spring的任何注解
- * 若依赖外部的对象,使用 getServer()方法进行手动注入
- * @author GCC
- */
-public abstract class AbstractBaseCronTask implements Runnable{
-
- public Logger log;
-
-
- private TaskEntity taskEntity;
-
-
- private Double consumptionTime;
-
- private ApplicationContext applicationContext;
-
-
- public AbstractBaseCronTask(TaskEntity taskEntity){
- log = LoggerFactory.getLogger(taskEntity.getTaskName());
- this.taskEntity = taskEntity;
- }
-
-
- //前置操作
- public abstract void beforeJob();
-
-
- //任务操作
- public abstract void startJob();
-
-
- //后置操作
- public abstract void afterJob();
-
-
- @Override
- public void run() {
- String id = this.taskEntity.getTaskId();
- this.taskEntity = getServer(TaskRepository.class).queryData(id);
- log.info("---------------------任务 {} 开始执行-----------------------",taskEntity.getTaskName());
- log.info("任务描述:"+taskEntity.getTaskDesc());
- consumptionTime = 0d;
- try {
- Long start = System.currentTimeMillis();
- beforeJob();
- startJob();
- afterJob();
- Long end = System.currentTimeMillis();
- consumptionTime = NumberUtil.div((end - start),1000);
- log.info("任务耗时:约 {} s",consumptionTime);
- taskEntity.setTaskLastRun(1);
- }catch (Exception e){
- log.error("任务{}计算出错!请及时排查问题!", taskEntity.getTaskName(),e);
- taskEntity.setTaskLastRun(0);
- }
- getServer(TaskRepository.class).update(taskEntity);
- log.info("---------------------任务 {} 结束执行-----------------------\n",taskEntity.getTaskName());
- }
-
-
- public Object getSelfConfig(String key){
- try{
- TaskEntity entity = getServer(TaskRepository.class).queryData(taskEntity.getTaskId());
- JSONObject config = JSONUtil.parseObj(entity.getTaskOutConfig());
- return config.get(key);
- }catch (Exception e){
- log.error("获取任务 {} 的配置参数失败,请确认参数配置格式是否正确!",taskEntity.getTaskName());
- }
- return new JSONObject();
- }
-
-
- public double getRunTime(){ return this.consumptionTime;}
-
- public TaskEntity getThisTaskInfo(){
- return this.taskEntity;
- }
-
- public void setApplicationContext(ApplicationContext applicationContext) {
- this.applicationContext = applicationContext;
- }
-
-
- /**
- * 为适配反射生成的对象不受Spring容器管辖导致对象不共用问题
- * 提供手动获取系统上下文容器完成依赖注入
- * 通过类名使用Spring容器中的对象
- * @param className 类
- * @param 返回类型
- * @return T
- */
- public T getServer(Class className){
- return applicationContext.getBean(className);
- }
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java b/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
deleted file mode 100644
index 6085c3a..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.gcc.container.components.task.compont;
-
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-/**
- * 初始化任务调度机制
- * @author GCC
- */
-@Order(1)
-@Slf4j
-@Component
-public class InitTaskSchedulingApplication implements ApplicationRunner {
-
- private TaskSchedule taskSchedule;
-
-
- private TaskTempFactory taskTempFactory;
-
-
- @Autowired
- public void setTaskScheduleServer(TaskSchedule taskSchedule) {
- this.taskSchedule = taskSchedule;
- }
-
- @Autowired
- public void setTaskTempFactory(TaskTempFactory taskTempFactory) {
- this.taskTempFactory = taskTempFactory;
- }
-
- @Override
- public void run(ApplicationArguments args) throws Exception {
- //开启扫描
- taskTempFactory.scanTaskInfo();
- log.info("【定时任务初始化】 容器初始化");
- taskSchedule.initScheduling();
- log.info("【定时任务初始化】定时任务初始化任务开始");
- taskSchedule.loadAllTask();
- log.info("【定时任务初始化】定时任务初始化任务完成");
-
- }
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
deleted file mode 100644
index c2d2949..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.gcc.container.components.task.compont;
-
-
-
-
-import com.gcc.container.components.task.model.entity.TaskEntity;
-
-import java.util.concurrent.ConcurrentHashMap;
-
-public interface TaskSchedule {
-
-
-
- ConcurrentHashMap getTaskSchedulingRam();
-
-
- /**
- * 初始化任务调度
- */
- void initScheduling();
-
- /**
- * 添加任务至内存及容器
- * @param taskEntity 任务实体
- * @return boolean
- */
- boolean addTaskToScheduling(TaskEntity taskEntity);
-
- /**
- * 从任务调度器中移除任务
- * @param id 任务id
- * @return Boolean
- */
- boolean removeTaskFromScheduling(String id);
-
-
- /**
- * 执行指定任务
- * @param id 任务id
- * @return double 耗时
- */
- double runTaskById(String id);
-
-
- /**
- * 清空任务
- */
- void claearAllTask();
-
-
-
- /**
- * 加载所有任务
- */
- void loadAllTask();
-
- /**
- * 运行开机自启任务
- */
- void runBootUpTask();
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
deleted file mode 100644
index d9f58a7..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package com.gcc.container.components.task.compont;
-
-
-import cn.hutool.core.util.NumberUtil;
-import com.gcc.container.components.task.dao.TaskRepository;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
-import org.springframework.scheduling.support.CronTrigger;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Constructor;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ScheduledFuture;
-
-@Slf4j
-@Component
-public class TaskScheduleImpl implements TaskSchedule {
-
- //正在运行的任务
- private static ConcurrentHashMap runningTasks = new ConcurrentHashMap<>();
-
- //线程池任务调度
- private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
-
- //内存中任务对象
- private static ConcurrentHashMap ramTasks = new ConcurrentHashMap<>();
-
- //Spring容器池,用于注入Spring的bean
- private ApplicationContext context;
-
-
- private TaskRepository taskRepository;
-
-
- private TaskTempFactory taskFactory;
-
-
- @Autowired
- public void setTaskRepository(TaskRepository taskRepository) {
- this.taskRepository = taskRepository;
- }
-
- @Autowired
- public void setContext(ApplicationContext context) {
- this.context = context;
- }
-
- @Autowired
- public void setTaskFactory(TaskTempFactory taskFactory) {
- this.taskFactory = taskFactory;
- }
-
- @Autowired
-
-
- @Override
- public ConcurrentHashMap getTaskSchedulingRam() {
- return ramTasks;
- }
-
- @Override
- public void initScheduling() {
- int num = taskFactory.mergeTaskEntities().size();
- num = num > 0 ? num:1;
- this.threadPoolTaskScheduler.setPoolSize(num);
- this.threadPoolTaskScheduler.setThreadNamePrefix("task-thread-");
- this.threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
- this.threadPoolTaskScheduler.initialize();
- }
-
-
- @Override
- public boolean addTaskToScheduling(TaskEntity task) {
- if(!runningTasks.containsKey(task.getTaskId())){
- try{
- Class> clazz = Class.forName(task.getTaskClass());
- Constructor c = clazz.getConstructor(TaskEntity.class);
- AbstractBaseCronTask runnable = (AbstractBaseCronTask) c.newInstance(task);
- //反射方式生成对象不属于Spring容器管控,对于Spring的bean使用需要手动注入
- runnable.setApplicationContext(context);
- CronTrigger cron = new CronTrigger(task.getTaskCron());
- //put到runTasks
- runningTasks.put(task.getTaskId(), Objects.requireNonNull(this.threadPoolTaskScheduler.schedule(runnable, cron)));
- //存入内存中,便于外部调用
- ramTasks.put(task.getTaskId(),runnable);
- task.setTaskRamStatus(1);
- taskRepository.update(task);
- return true;
- }catch (Exception e){
- log.error("定时任务加载失败..."+e);
- }
- }
- return false;
- }
-
-
- @Override
- public boolean removeTaskFromScheduling(String id) {
- if(runningTasks.containsKey(id)){
- runningTasks.get(id).cancel(true);
- runningTasks.remove(id);
- ramTasks.remove(id);
- TaskEntity entity = taskRepository.queryData(id);
- entity.setTaskRamStatus(0);
- entity.setTaskLastRun(null);
- if( 1 == taskRepository.update(entity) && !runningTasks.containsKey(id)){
- log.info("【定时任务控制器】任务"+id+"从内存进程池中移除,被终止!");
- return true;
- }
- }
- return false;
- }
-
- @Override
- public double runTaskById(String id) {
- TaskEntity task = taskRepository.queryData(id);
- if(null!=task) {
- if (runningTasks.containsKey(task.getTaskId())){
- ramTasks.get(task.getTaskId()).run();
- return ramTasks.get(task.getTaskId()).getRunTime();
- }
- }
- return 0d;
- }
-
- @Override
- public void claearAllTask() {
- ramTasks.clear();
- log.info("【定时任务控制器】清除内存任务 完成");
- runningTasks.clear();
- log.info("【定时任务控制器】清除线程任务 完成");
- threadPoolTaskScheduler.shutdown();
- }
-
- @Override
- public void loadAllTask() {
- List allTask = taskFactory.mergeTaskEntities();
- for (TaskEntity task : allTask) {
- if(addTaskToScheduling(task)){
- log.info("【定时任务初始化】装填任务:{} [ 任务执行周期:{} ] [ bootup:{}]",task.getTaskName(),task.getTaskCron(),task.getTaskBootUp());
- }
- }
- }
-
-
- @Override
- public void runBootUpTask() {
- List list = taskRepository.queryAllTask();
- for(TaskEntity task:list){
- if(1 == task.getTaskIsUse() && 1 == task.getTaskBootUp()) {
- runTaskById(task.getTaskId());
- }
- }
- }
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskTempFactory.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskTempFactory.java
deleted file mode 100644
index 1f0eca5..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskTempFactory.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.gcc.container.components.task.compont;
-
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.crypto.digest.DigestUtil;
-
-import com.gcc.container.components.task.annotation.TaskJob;
-import com.gcc.container.components.task.dao.TaskRepository;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import com.gcc.container.components.task.property.TaskDataProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
-import org.springframework.core.type.filter.AnnotationTypeFilter;
-import org.springframework.stereotype.Component;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Component
-class TaskTempFactory {
-
- @Autowired
- private TaskRepository taskRepository;
-
- @Autowired
- TaskDataProperties taskDataProperties;
-
- private List tempContainer = new ArrayList<>();
-
-
- public void scanTaskInfo() throws Exception {
- ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
- provider.addIncludeFilter(new AnnotationTypeFilter(TaskJob.class));
- Set beanDefinitions = provider.findCandidateComponents(taskDataProperties.getTaskClassPackage());
- for (BeanDefinition beanDefinition : beanDefinitions) {
- Class> clazz = Class.forName(beanDefinition.getBeanClassName());
- TaskJob taskJob = clazz.getAnnotation(TaskJob.class);
- if (AbstractBaseCronTask.class.isAssignableFrom(clazz)) {
- tempContainer.add(builderTaskEntity(clazz,taskJob));
- } else {
- throw new IllegalArgumentException("Class " + clazz.getName() + " must extend AbstractBaseCronTask");
- }
- }
- }
-
-
- public List mergeTaskEntities() {
- List db = getIsUseTask();
- Map map = db.stream()
- .collect(Collectors.toMap(
- TaskEntity::getTaskClass,
- task -> task
- ));
- for(TaskEntity entity:tempContainer){
- if(!map.containsKey(entity.getTaskClass())){
- taskRepository.save(entity);
- db.add(entity);
- }
- }
- return db;
- }
-
-
- private TaskEntity builderTaskEntity(Class> cronTaskClass, TaskJob taskJob) {
- String path = cronTaskClass.getName(); TaskEntity entity = new TaskEntity();
- entity.setTaskId(DigestUtil.md5Hex(path));
- entity.setTaskClass(path);
- entity.setTaskIsUse(1);
- entity.setTaskName(cronTaskClass.getSimpleName());
- entity.setTaskDesc(taskJob.desc());
- entity.setTaskBootUp(converBootUp(taskJob.bootup()));
- entity.setTaskCron(taskJob.cron());
- entity.setTaskCreateTime(DateUtil.now());
- //todo 外部配置
- return entity;
- }
-
-
- private List getIsUseTask(){
- List list = taskRepository.queryAllTask();
- List result = new ArrayList<>();
- for(TaskEntity entity:list){
- if(entity.isUse()){
- result.add(entity);
- }
- }
- return result;
- }
-
- private Integer converBootUp(Boolean flag){
- if(flag){
- return 1;
- }
- return 0;
- }
-}
--
Gitee
From 0ea1f2272196fee61da41e09b1400a1b16ff4e95 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:56:05 +0000
Subject: [PATCH 07/14] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=A0=B8=E5=BF=83?=
=?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=88=E7=B1=BB=E7=BA=A7=E5=88=AB=E3=80=81?=
=?UTF-8?q?=E6=96=B9=E6=B3=95=E7=BA=A7=E5=88=AB=E4=BB=BB=E5=8A=A1=E6=B3=A8?=
=?UTF-8?q?=E5=86=8C=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../task/compont/AbstractBaseCronTask.java | 112 ++++++++++
.../task/compont/BaseMethodLevelTask.java | 52 +++++
.../InitTaskSchedulingApplication.java | 48 +++++
.../components/task/compont/TaskFactory.java | 195 ++++++++++++++++++
.../components/task/compont/TaskSchedule.java | 62 ++++++
.../task/compont/TaskScheduleImpl.java | 172 +++++++++++++++
6 files changed, 641 insertions(+)
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/BaseMethodLevelTask.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java b/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
new file mode 100644
index 0000000..06f6e38
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/AbstractBaseCronTask.java
@@ -0,0 +1,112 @@
+package com.gcc.container.components.task.compont;
+
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.gcc.container.components.task.dao.TaskRepository;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * 抽象定时任务类
+ * 实现定时任务需要继承该类
+ * 子类实现时,不要使用Spring的任何注解
+ * 若依赖外部的对象,使用 getServer()方法进行手动注入
+ * @author GCC
+ */
+public abstract class AbstractBaseCronTask implements Runnable{
+
+ public Logger log;
+
+
+ private TaskEntity taskEntity;
+
+
+ private Double consumptionTime;
+
+ private ApplicationContext applicationContext;
+
+
+ public AbstractBaseCronTask(TaskEntity taskEntity){
+ log = LoggerFactory.getLogger(taskEntity.getTaskName());
+ this.taskEntity = taskEntity;
+ }
+
+
+ //前置操作
+ public abstract void beforeJob();
+
+
+ //任务操作
+ public abstract void startJob();
+
+
+ //后置操作
+ public abstract void afterJob();
+
+
+ @Override
+ public void run() {
+ String id = this.taskEntity.getTaskId();
+ this.taskEntity = getServer(TaskRepository.class).queryData(id);
+ log.info("---------------------任务 {} 开始执行-----------------------",taskEntity.getTaskName());
+ log.info("任务描述:"+taskEntity.getTaskDesc());
+ consumptionTime = 0d;
+ try {
+ Long start = System.currentTimeMillis();
+ beforeJob();
+ startJob();
+ afterJob();
+ Long end = System.currentTimeMillis();
+ consumptionTime = NumberUtil.div((end - start),1000);
+ log.info("任务耗时:约 {} s",consumptionTime);
+ taskEntity.setTaskLastRun(1);
+ }catch (Exception e){
+ log.error("任务{}计算出错!请及时排查问题!", taskEntity.getTaskName(),e);
+ e.printStackTrace();
+ taskEntity.setTaskLastRun(0);
+ }
+ getServer(TaskRepository.class).update(taskEntity);
+ log.info("---------------------任务 {} 结束执行-----------------------\n",taskEntity.getTaskName());
+ }
+
+
+ public Object getSelfConfig(String key){
+ try{
+ TaskEntity entity = getServer(TaskRepository.class).queryData(taskEntity.getTaskId());
+ JSONObject config = JSONUtil.parseObj(entity.getTaskOutConfig());
+ return config.get(key);
+ }catch (Exception e){
+ log.error("获取任务 {} 的配置参数失败,请确认参数配置格式是否正确!",taskEntity.getTaskName());
+ }
+ return new JSONObject();
+ }
+
+
+ public double getRunTime(){ return this.consumptionTime;}
+
+ public TaskEntity getThisTaskInfo(){
+ return this.taskEntity;
+ }
+
+ public void setApplicationContext(ApplicationContext applicationContext) {
+ this.applicationContext = applicationContext;
+ }
+
+
+ /**
+ * 为适配反射生成的对象不受Spring容器管辖导致对象不共用问题
+ * 提供手动获取系统上下文容器完成依赖注入
+ * 通过类名使用Spring容器中的对象
+ * @param className 类
+ * @param 返回类型
+ * @return T
+ */
+ public T getServer(Class className){
+ return applicationContext.getBean(className);
+ }
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/BaseMethodLevelTask.java b/task-component/src/main/java/com/gcc/container/components/task/compont/BaseMethodLevelTask.java
new file mode 100644
index 0000000..0d56a45
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/BaseMethodLevelTask.java
@@ -0,0 +1,52 @@
+package com.gcc.container.components.task.compont;
+
+import com.gcc.container.components.task.model.entity.TaskEntity;
+
+import java.lang.reflect.Method;
+
+/**
+ * 方法级别定时任务基类
+ * @author GCC
+ */
+class BaseMethodLevelTask extends AbstractBaseCronTask{
+
+
+ private Class> beanPath;
+
+ private String methodName;
+
+
+ private Method method = null;
+
+
+ public BaseMethodLevelTask(TaskEntity taskEntity, Class> className, String methodName) {
+ super(taskEntity);
+ this.beanPath = className;
+ this.methodName = methodName;
+ }
+
+ @Override
+ public void beforeJob() {
+ try {
+ method = Class.forName(beanPath.getName()).getMethod(methodName);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void startJob(){
+ if(null != method){
+ try {
+ method.invoke(getServer(beanPath));
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void afterJob() {
+
+ }
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java b/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
new file mode 100644
index 0000000..f9199ef
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/InitTaskSchedulingApplication.java
@@ -0,0 +1,48 @@
+package com.gcc.container.components.task.compont;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * 初始化任务调度机制
+ * @author GCC
+ */
+@Order(1)
+@Slf4j
+@Component
+public class InitTaskSchedulingApplication implements ApplicationRunner {
+
+ private TaskSchedule taskSchedule;
+
+
+ private TaskFactory taskFactory;
+
+
+ @Autowired
+ public void setTaskScheduleServer(TaskSchedule taskSchedule) {
+ this.taskSchedule = taskSchedule;
+ }
+
+ @Autowired
+ public void setTaskTempFactory(TaskFactory taskFactory) {
+ this.taskFactory = taskFactory;
+ }
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ //开启扫描
+ taskFactory.scanTaskInfo();
+ log.info("【定时任务初始化】 容器初始化");
+ taskSchedule.initScheduling();
+ log.info("【定时任务初始化】定时任务初始化任务开始");
+ taskSchedule.loadAllTask();
+ log.info("【定时任务初始化】定时任务初始化任务完成");
+
+ }
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java
new file mode 100644
index 0000000..1cabd5e
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskFactory.java
@@ -0,0 +1,195 @@
+package com.gcc.container.components.task.compont;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+
+import cn.hutool.json.JSONObject;
+import com.gcc.container.components.task.annotation.MethodJob;
+import com.gcc.container.components.task.annotation.ClassJob;
+import com.gcc.container.components.task.dao.TaskRepository;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.model.enums.TaskLevel;
+import com.gcc.container.components.task.property.TaskDataProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Service;
+import java.lang.reflect.Method;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+class TaskFactory {
+
+ private ApplicationContext context;
+
+
+ private TaskRepository taskRepository;
+
+
+ private TaskDataProperties taskDataProperties;
+
+
+ public final String CLASS_PATH = "com.gcc.container.components.task.compont.BaseMethodLevelTask";
+
+
+ private List tempContainer = new ArrayList<>();
+
+
+ @Autowired
+ public void setContext(ApplicationContext context) {
+ this.context = context;
+ }
+
+ @Autowired
+ public void setTaskRepository(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ @Autowired
+ public void setTaskDataProperties(TaskDataProperties taskDataProperties) {
+ this.taskDataProperties = taskDataProperties;
+ }
+
+
+ public void scanTaskInfo() throws Exception {
+ //扫描类级任务
+ ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
+ provider.addIncludeFilter(new AnnotationTypeFilter(ClassJob.class));
+ Set beanDefinitions = provider.findCandidateComponents(taskDataProperties.getTaskClassPackage());
+ for (BeanDefinition beanDefinition : beanDefinitions) {
+ Class> clazz = Class.forName(beanDefinition.getBeanClassName());
+ ClassJob classJob = clazz.getAnnotation(ClassJob.class);
+ if (AbstractBaseCronTask.class.isAssignableFrom(clazz)) {
+ tempContainer.add(buildTaskEntity(clazz, classJob));
+ } else {
+ throw new IllegalArgumentException("Class " + clazz.getName() + " must extend AbstractBaseCronTask");
+ }
+ }
+ //扫描方法级任务
+ //仅支持在 Component、Service、Repository 注解上的定时任务
+ Map allBeans = context.getBeansWithAnnotation(Component.class);
+ allBeans.putAll(context.getBeansWithAnnotation(Service.class));
+ allBeans.putAll(context.getBeansWithAnnotation(Repository.class));
+ for (Object bean : allBeans.values()) {
+ Class> beanClass = bean.getClass();
+ for (Method method : beanClass.getDeclaredMethods()) {
+ if (method.isAnnotationPresent(MethodJob.class)) {
+ MethodJob annotation = method.getAnnotation(MethodJob.class);
+ String className = beanClass.getName();
+ String methodName = method.getName();
+ tempContainer.add(buildMethodTaskEntity(className,methodName,annotation));
+ }
+ }
+ }
+ }
+
+
+ public List mergeTaskEntities() {
+ Map> db = getIsUseTask();
+
+ List classLevelJob = db.get("ClassLevel");
+
+ List methodLevelJob =db.get("MethodLevel");
+
+ Map ClassLevelMap = classLevelJob.stream()
+ .collect(Collectors.toMap(
+ TaskEntity::getTaskClass,
+ task -> task
+ ));
+ Map methodLevelMap = methodLevelJob.stream()
+ .collect(Collectors.toMap(
+ TaskEntity::getTaskId,
+ task -> task
+ ));
+
+ for(TaskEntity entity:tempContainer){
+ //类级别任务
+ if(TaskLevel.CLASS_LEVEL == entity.getTaskLevel()){
+ if(!ClassLevelMap.containsKey(entity.getTaskClass())){
+ taskRepository.save(entity);
+ classLevelJob.add(entity);
+ }
+ }
+ //方法级别任务
+ if(TaskLevel.METHOD_LEVEL == entity.getTaskLevel()){
+ if(!methodLevelMap.containsKey(entity.getTaskId())){
+ taskRepository.save(entity);
+ methodLevelJob.add(entity);
+ }
+ }
+ }
+ //合并两处任务
+ classLevelJob.addAll(methodLevelJob);
+ return classLevelJob;
+ }
+
+
+ private TaskEntity buildTaskEntity(Class> cronTaskClass, ClassJob classJob) {
+ String path = cronTaskClass.getName();
+ TaskEntity entity = new TaskEntity();
+ entity.setTaskId(DigestUtil.md5Hex(path));
+ entity.setTaskClass(path);
+ entity.setTaskIsUse(1);
+ entity.setTaskName(cronTaskClass.getSimpleName());
+ entity.setTaskDesc(classJob.desc());
+ entity.setTaskBootUp(converBootUp(classJob.bootup()));
+ entity.setTaskCron(classJob.cron());
+ entity.setTaskCreateTime(DateUtil.now());
+ entity.setTaskLevel(TaskLevel.CLASS_LEVEL);
+ return entity;
+ }
+
+ private TaskEntity buildMethodTaskEntity(String beanClass,String method, MethodJob methodJob) {
+ String key = beanClass+"."+method+"()";
+ TaskEntity entity = new TaskEntity();
+ entity.setTaskId(DigestUtil.md5Hex(key));
+ entity.setTaskClass(CLASS_PATH);
+ entity.setTaskIsUse(1);
+ entity.setTaskName(method);
+ entity.setTaskDesc(methodJob.desc());
+ entity.setTaskBootUp(converBootUp(methodJob.bootup()));
+ entity.setTaskCron(methodJob.cron());
+ entity.setTaskCreateTime(DateUtil.now());
+ entity.setTaskLevel(TaskLevel.METHOD_LEVEL);
+ entity.setLoadConfigure(new JSONObject()
+ .set("beanClass",beanClass)
+ .set("methodName",method).toJSONString(0));
+ return entity;
+ }
+
+
+ private Map> getIsUseTask(){
+ Map> resultMap = new HashMap<>();
+ List list = taskRepository.queryAllTask();
+ List methodLevel = new ArrayList<>();
+ List classLevel = new ArrayList<>();
+ for(TaskEntity entity:list){
+ if(entity.isUse()){
+
+ if(TaskLevel.CLASS_LEVEL == entity.getTaskLevel()){
+ classLevel.add(entity);
+ }
+
+ if(TaskLevel.METHOD_LEVEL == entity.getTaskLevel()){
+ methodLevel.add(entity);
+ }
+ }
+ }
+ resultMap.put("ClassLevel",classLevel);
+ resultMap.put("MethodLevel",methodLevel);
+ return resultMap;
+ }
+
+ private Integer converBootUp(Boolean flag){
+ if(flag){
+ return 1;
+ }
+ return 0;
+ }
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
new file mode 100644
index 0000000..c2d2949
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskSchedule.java
@@ -0,0 +1,62 @@
+package com.gcc.container.components.task.compont;
+
+
+
+
+import com.gcc.container.components.task.model.entity.TaskEntity;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public interface TaskSchedule {
+
+
+
+ ConcurrentHashMap getTaskSchedulingRam();
+
+
+ /**
+ * 初始化任务调度
+ */
+ void initScheduling();
+
+ /**
+ * 添加任务至内存及容器
+ * @param taskEntity 任务实体
+ * @return boolean
+ */
+ boolean addTaskToScheduling(TaskEntity taskEntity);
+
+ /**
+ * 从任务调度器中移除任务
+ * @param id 任务id
+ * @return Boolean
+ */
+ boolean removeTaskFromScheduling(String id);
+
+
+ /**
+ * 执行指定任务
+ * @param id 任务id
+ * @return double 耗时
+ */
+ double runTaskById(String id);
+
+
+ /**
+ * 清空任务
+ */
+ void claearAllTask();
+
+
+
+ /**
+ * 加载所有任务
+ */
+ void loadAllTask();
+
+ /**
+ * 运行开机自启任务
+ */
+ void runBootUpTask();
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
new file mode 100644
index 0000000..1272500
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/compont/TaskScheduleImpl.java
@@ -0,0 +1,172 @@
+package com.gcc.container.components.task.compont;
+
+
+import com.gcc.container.components.task.dao.TaskRepository;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.model.enums.TaskLevel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Constructor;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+
+@Slf4j
+@Component
+public class TaskScheduleImpl implements TaskSchedule {
+
+ //正在运行的任务
+ private static ConcurrentHashMap runningTasks = new ConcurrentHashMap<>();
+
+ //线程池任务调度
+ private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
+
+ //内存中任务对象
+ private static ConcurrentHashMap ramTasks = new ConcurrentHashMap<>();
+
+ //Spring容器池,用于注入Spring的bean
+ private ApplicationContext context;
+
+
+ private TaskRepository taskRepository;
+
+
+ private TaskFactory taskFactory;
+
+
+ @Autowired
+ public void setTaskRepository(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ @Autowired
+ public void setContext(ApplicationContext context) {
+ this.context = context;
+ }
+
+ @Autowired
+ public void setTaskFactory(TaskFactory taskFactory) {
+ this.taskFactory = taskFactory;
+ }
+
+ @Autowired
+
+
+ @Override
+ public ConcurrentHashMap getTaskSchedulingRam() {
+ return ramTasks;
+ }
+
+ @Override
+ public void initScheduling() {
+ int num = taskFactory.mergeTaskEntities().size();
+ num = num > 0 ? num:1;
+ this.threadPoolTaskScheduler.setPoolSize(num);
+ this.threadPoolTaskScheduler.setThreadNamePrefix("task-thread-");
+ this.threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
+ this.threadPoolTaskScheduler.initialize();
+ }
+
+
+ @Override
+ public boolean addTaskToScheduling(TaskEntity task) {
+ if(!runningTasks.containsKey(task.getTaskId())){
+ try{
+ Class> clazz = Class.forName(task.getTaskClass());
+ AbstractBaseCronTask runnable = null;
+ //类级别任务
+ if(TaskLevel.CLASS_LEVEL == task.getTaskLevel()) {
+ Constructor c = clazz.getConstructor(TaskEntity.class);
+ runnable = (AbstractBaseCronTask) c.newInstance(task);
+ }
+ //方法级别任务
+ if(TaskLevel.METHOD_LEVEL == task.getTaskLevel()){
+ String className = task.getLoadConfiguration().getStr("beanClass");
+ String methodName = task.getLoadConfiguration().getStr("methodName");
+ Constructor c = clazz.getConstructor(TaskEntity.class,Class.class,String.class);
+ runnable = (AbstractBaseCronTask) c.newInstance(task, context.getBean(Class.forName(className)).getClass(),methodName);
+ }
+ //反射方式生成对象不属于Spring容器管控,对于Spring的bean使用需要手动注入
+ runnable.setApplicationContext(context);
+ CronTrigger cron = new CronTrigger(task.getTaskCron());
+ //put到runTasks
+ runningTasks.put(task.getTaskId(), Objects.requireNonNull(this.threadPoolTaskScheduler.schedule(runnable, cron)));
+ //存入内存中,便于外部调用
+ ramTasks.put(task.getTaskId(),runnable);
+ task.setTaskRamStatus(1);
+ taskRepository.update(task);
+ return true;
+ }catch (Exception e){
+ log.error("定时任务{}加载失败..."+e,task.getTaskName());
+ taskRepository.removeByTaskId(task.getTaskId());
+ }
+ }
+ return false;
+ }
+
+
+ @Override
+ public boolean removeTaskFromScheduling(String id) {
+ if(runningTasks.containsKey(id)){
+ runningTasks.get(id).cancel(true);
+ runningTasks.remove(id);
+ ramTasks.remove(id);
+ TaskEntity entity = taskRepository.queryData(id);
+ entity.setTaskRamStatus(0);
+ entity.setTaskLastRun(null);
+ if( 1 == taskRepository.update(entity) && !runningTasks.containsKey(id)){
+ log.info("【定时任务控制器】任务"+id+"从内存进程池中移除,被终止!");
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public double runTaskById(String id) {
+ TaskEntity task = taskRepository.queryData(id);
+ if(null!=task) {
+ if (runningTasks.containsKey(task.getTaskId())){
+ ramTasks.get(task.getTaskId()).run();
+ return ramTasks.get(task.getTaskId()).getRunTime();
+ }
+ }
+ return 0d;
+ }
+
+ @Override
+ public void claearAllTask() {
+ ramTasks.clear();
+ log.info("【定时任务控制器】清除内存任务 完成");
+ runningTasks.clear();
+ log.info("【定时任务控制器】清除线程任务 完成");
+ threadPoolTaskScheduler.shutdown();
+ }
+
+ @Override
+ public void loadAllTask() {
+ List allTask = taskFactory.mergeTaskEntities();
+ for (TaskEntity task : allTask) {
+ if(addTaskToScheduling(task)){
+ log.info("【定时任务初始化】装填任务:{} [ 任务执行周期:{} ] [ bootup:{}]",task.getTaskName(),task.getTaskCron(),task.getTaskBootUp());
+ }
+ }
+ }
+
+
+ @Override
+ public void runBootUpTask() {
+ List list = taskRepository.queryAllTask();
+ for(TaskEntity task:list){
+ if(1 == task.getTaskIsUse() && 1 == task.getTaskBootUp()) {
+ runTaskById(task.getTaskId());
+ }
+ }
+ }
+}
--
Gitee
From 6be3db79f410ce9be7bcb8ebce89a0a9935e5dfa Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:56:20 +0000
Subject: [PATCH 08/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/da?=
=?UTF-8?q?o?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/task/dao/TaskRepository.java | 57 -------
.../dao/impl/FileOpTaskRepositoryImpl.java | 154 ------------------
2 files changed, 211 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java b/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
deleted file mode 100644
index c05ea46..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.gcc.container.components.task.dao;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import java.util.List;
-/**
- * 任务数据操作
- */
-public interface TaskRepository {
-
- /**
- * 新增数据
- * @param entity
- * @return int
- */
- int save(TaskEntity entity);
-
-
- /**
- * 删除任务ID
- * @param id id
- * @return int
- */
- int removeByTaskId(String id);
-
-
- /**
- * 更新整个任务
- * @param entity 实体
- * @return int
- */
- int update(TaskEntity entity);
-
-
- /**
- * 查询全部任务
- * @return List
- */
- List queryAllTask();
-
-
-
- /**
- * 查询数据
- * @param entity 查询
- * @return TaskEntity
- */
- List queryData(TaskEntity entity);
-
-
-
-
- /**
- * 查询具体的任务实体
- * @param taskId 任务id
- * @return TaskEntity
- */
- TaskEntity queryData(String taskId);
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java b/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
deleted file mode 100644
index 50fefe6..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package com.gcc.container.components.task.dao.impl;
-
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONArray;
-import cn.hutool.json.JSONUtil;
-import com.gcc.container.components.task.dao.TaskRepository;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import com.gcc.container.components.task.property.TaskDataProperties;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Repository;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-@Repository
-@Slf4j
-public class FileOpTaskRepositoryImpl implements TaskRepository {
-
-
- @Autowired
- private TaskDataProperties properties;
-
-
-
- @Override
- public int save(TaskEntity entity) {
- List list = readFileInfo();
- list.add(entity);
- writeFileInfo(list);
- return 1;
- }
-
- @Override
- public int removeByTaskId(String id) {
- List list = readFileInfo();
- List data = new ArrayList<>();
- for(TaskEntity entity:list){
- if(!entity.getTaskId().equals(id)){
- data.add(entity);
- }
- }
- writeFileInfo(data);
- return list.size() - data.size();
- }
-
-
- @Override
- public int update(TaskEntity entity) {
- List list = readFileInfo();
- List data = new ArrayList<>();
- for(TaskEntity one:list){
- if(!one.getTaskId().equals(entity.getTaskId())){
- data.add(one);
- }
- }
- data.add(entity);
- writeFileInfo(data);
- return 1;
- }
-
- @Override
- public List queryAllTask() {
- return readFileInfo();
- }
-
- @Override
- public List queryData(TaskEntity entity) {
- List list = readFileInfo();
- // 获取不为空的属性
- Map nonNullProperties = entity.getNonNullProperties();
- // 进行 AND 查询
- List result = new ArrayList<>();
- for (TaskEntity t : list) {
- boolean match = true;
- for (Map.Entry entry : nonNullProperties.entrySet()) {
- String key = entry.getKey();
- Object value = entry.getValue();
- if ("taskDesc".equals(key) && !StrUtil.equals(t.getTaskDesc(), (String) value)) {
- match = false;
- break;
- }
- if ("taskIsUse".equals(key) && t.getTaskIsUse() != (Integer) value) {
- match = false;
- break;
- }
- if ("taskBootUp".equals(key) && t.getTaskBootUp() != (Integer) value) {
- match = false;
- break;
- }
- }
- if (match) {
- result.add(t);
- }
- }
- return result;
- }
-
-
-
-
- @Override
- public TaskEntity queryData(String id) {
- List list = readFileInfo();
- for(TaskEntity entity:list){
- if(1 == entity.getTaskIsUse() && id.equals(entity.getTaskId())){
- return entity;
- }
- }
- return null;
- }
-
-
- private List readFileInfo(){
- // 确保文件存在
- File file = FileUtil.file(getDefaultPath());
- if (!file.exists()) {
- log.error("FILE is not exists");
- return new ArrayList<>();
- }
- // 读取 JSON 文件内容
- String jsonContent = FileUtil.readUtf8String(getDefaultPath());
- // 将 JSON 字符串转换为 JSON 对象
- JSONArray data = JSONUtil.parseArray(jsonContent);
- List result = new ArrayList<>();
- for(int i = 0; i < data.size(); i++){
- result.add(JSONUtil.toBean(data.getJSONObject(i),TaskEntity.class));
- }
- return result;
- }
-
-
-
- /**
- * 覆盖写入 JSONArray 文件
- */
- private void writeFileInfo(List data) {
- JSONArray array = new JSONArray(data);
- // 确保文件存在或创建文件
- File file = FileUtil.touch(getDefaultPath());
- FileUtil.writeUtf8String(array.toJSONString(0), file);
- }
-
-
- private String getDefaultPath(){
- if(StrUtil.isNotBlank(properties.getDataFilePath())){
- return properties.getDataFilePath();
- }
- return "db/task_info.json";
- }
-
-}
--
Gitee
From c575f6b125f228a9bf1115b3f47da38ea18530e7 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:56:50 +0000
Subject: [PATCH 09/14] =?UTF-8?q?=E5=9B=A0=E6=A0=B8=E5=BF=83=E9=80=BB?=
=?UTF-8?q?=E8=BE=91=E5=8F=98=E5=8A=A8=E5=AF=BC=E8=87=B4=E7=9A=84=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=93=8D=E4=BD=9C=E5=8F=98=E5=8A=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../components/task/dao/TaskRepository.java | 57 +++++++
.../dao/impl/FileOpTaskRepositoryImpl.java | 154 ++++++++++++++++++
2 files changed, 211 insertions(+)
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java b/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
new file mode 100644
index 0000000..c05ea46
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/dao/TaskRepository.java
@@ -0,0 +1,57 @@
+package com.gcc.container.components.task.dao;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import java.util.List;
+/**
+ * 任务数据操作
+ */
+public interface TaskRepository {
+
+ /**
+ * 新增数据
+ * @param entity
+ * @return int
+ */
+ int save(TaskEntity entity);
+
+
+ /**
+ * 删除任务ID
+ * @param id id
+ * @return int
+ */
+ int removeByTaskId(String id);
+
+
+ /**
+ * 更新整个任务
+ * @param entity 实体
+ * @return int
+ */
+ int update(TaskEntity entity);
+
+
+ /**
+ * 查询全部任务
+ * @return List
+ */
+ List queryAllTask();
+
+
+
+ /**
+ * 查询数据
+ * @param entity 查询
+ * @return TaskEntity
+ */
+ List queryData(TaskEntity entity);
+
+
+
+
+ /**
+ * 查询具体的任务实体
+ * @param taskId 任务id
+ * @return TaskEntity
+ */
+ TaskEntity queryData(String taskId);
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java b/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
new file mode 100644
index 0000000..198aba1
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/dao/impl/FileOpTaskRepositoryImpl.java
@@ -0,0 +1,154 @@
+package com.gcc.container.components.task.dao.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONUtil;
+import com.gcc.container.components.task.dao.TaskRepository;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.property.TaskDataProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+@Slf4j
+public class FileOpTaskRepositoryImpl implements TaskRepository {
+
+
+ @Autowired
+ private TaskDataProperties properties;
+
+
+
+ @Override
+ public int save(TaskEntity entity) {
+ List list = readFileInfo();
+ list.add(entity);
+ writeFileInfo(list);
+ return 1;
+ }
+
+ @Override
+ public int removeByTaskId(String id) {
+ List list = readFileInfo();
+ List data = new ArrayList<>();
+ for(TaskEntity entity:list){
+ if(!entity.getTaskId().equals(id)){
+ data.add(entity);
+ }
+ }
+ writeFileInfo(data);
+ return list.size() - data.size();
+ }
+
+
+ @Override
+ public int update(TaskEntity entity) {
+ List list = readFileInfo();
+ List data = new ArrayList<>();
+ for(TaskEntity one:list){
+ if(!one.getTaskId().equals(entity.getTaskId())){
+ data.add(one);
+ }
+ }
+ data.add(entity);
+ writeFileInfo(data);
+ return 1;
+ }
+
+ @Override
+ public List queryAllTask() {
+ return readFileInfo();
+ }
+
+ @Override
+ public List queryData(TaskEntity entity) {
+ List list = readFileInfo();
+ // 获取不为空的属性
+ Map nonNullProperties = entity.getNonNullProperties();
+ // 进行 AND 查询
+ List result = new ArrayList<>();
+ for (TaskEntity t : list) {
+ boolean match = true;
+ for (Map.Entry entry : nonNullProperties.entrySet()) {
+ String key = entry.getKey();
+ Object value = entry.getValue();
+ if ("taskDesc".equals(key) && !StrUtil.equals(t.getTaskDesc(), (String) value)) {
+ match = false;
+ break;
+ }
+ if ("taskIsUse".equals(key) && t.getTaskIsUse() != (Integer) value) {
+ match = false;
+ break;
+ }
+ if ("taskBootUp".equals(key) && t.getTaskBootUp() != (Integer) value) {
+ match = false;
+ break;
+ }
+ }
+ if (match) {
+ result.add(t);
+ }
+ }
+ return result;
+ }
+
+
+
+
+ @Override
+ public TaskEntity queryData(String id) {
+ List list = readFileInfo();
+ for(TaskEntity entity:list){
+ if(1 == entity.getTaskIsUse() && id.equals(entity.getTaskId())){
+ return entity;
+ }
+ }
+ return null;
+ }
+
+
+ private List readFileInfo(){
+ // 确保文件存在
+ File file = FileUtil.file(getDefaultPath());
+ if (!file.exists()) {
+ log.warn("FILE is not exists");
+ return new ArrayList<>();
+ }
+ // 读取 JSON 文件内容
+ String jsonContent = FileUtil.readUtf8String(getDefaultPath());
+ // 将 JSON 字符串转换为 JSON 对象
+ JSONArray data = JSONUtil.parseArray(jsonContent);
+ List result = new ArrayList<>();
+ for(int i = 0; i < data.size(); i++){
+ result.add(JSONUtil.toBean(data.getJSONObject(i),TaskEntity.class));
+ }
+ return result;
+ }
+
+
+
+ /**
+ * 覆盖写入 JSONArray 文件
+ */
+ private void writeFileInfo(List data) {
+ JSONArray array = new JSONArray(data);
+ // 确保文件存在或创建文件
+ File file = FileUtil.touch(getDefaultPath());
+ FileUtil.writeUtf8String(array.toJSONString(0), file);
+ }
+
+
+ private String getDefaultPath(){
+ if(StrUtil.isNotBlank(properties.getDataFilePath())){
+ return properties.getDataFilePath();
+ }
+ return "db/task_info.json";
+ }
+
+}
--
Gitee
From b0b06ab02c5e1cd72fb106f9a08da2dd9509abf1 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:56:57 +0000
Subject: [PATCH 10/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/mo?=
=?UTF-8?q?del?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../task/model/TaskVoConvertor.java | 40 ------
.../task/model/dto/SearchTaskDto.java | 28 -----
.../task/model/entity/TaskEntity.java | 115 ------------------
.../task/model/vo/TaskRunRetVo.java | 70 -----------
.../components/task/model/vo/TaskVo.java | 55 ---------
5 files changed, 308 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java b/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
deleted file mode 100644
index fe9089c..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.gcc.container.components.task.model;
-
-
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import com.gcc.container.components.task.model.vo.TaskVo;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Component
-public class TaskVoConvertor {
-
-
- public TaskVo toTaskVo(TaskEntity entity){
- return TaskVo.builder()
- .taskId(entity.getTaskId())
- .taskName(entity.getTaskName())
- .taskDesc(entity.getTaskDesc())
- .taskCron(entity.getTaskCron())
- .taskOutConfig(entity.getTaskOutConfig())
- .taskBootUp(entity.getTaskBootUp())
- .taskCreateTime(entity.getTaskCreateTime())
- .status(ramStatusToRunStatus(entity.getTaskRamStatus()))
- .build();
- }
-
- public List toTaskVos(List entities){
- return entities.stream().map(this::toTaskVo).collect(Collectors.toList());
- }
-
- private TaskVo.TaskRunStatus ramStatusToRunStatus(Integer ramStatus){
- if(1 == ramStatus){
- return TaskVo.TaskRunStatus.open;
- }else {
- return TaskVo.TaskRunStatus.shutdown;
- }
- }
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java b/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
deleted file mode 100644
index d4f352c..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.gcc.container.components.task.model.dto;
-
-import lombok.Data;
-import java.io.Serializable;
-
-
-/**
- * 查询参数
- */
-@Data
-public class SearchTaskDto implements Serializable {
-
-
- private String filterKey;
-
-
- private Boolean isBootUp;
-
-
- private Integer lastRunStatus;
-
-
- private Integer pageNo;
-
-
- private Integer pageSize;
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java b/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
deleted file mode 100644
index cfb9bcc..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package com.gcc.container.components.task.model.entity;
-
-
-import lombok.Data;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 任务实体类
- * @author GCC
- */
-@Data
-public class TaskEntity implements Serializable {
-
- //todo 解决外部创建表的操作
-
- private String taskId;
-
- private String taskName;
-
- private String taskDesc;
-
- private String taskCron;
-
- private String taskClass;
-
- /**
- * 任务相关配置
- */
- private String taskOutConfig;
-
- /**
- * 任务注册时间
- */
- private String taskCreateTime;
-
- /**
- * 是否启用
- */
- private Integer taskIsUse;
-
- /**
- * 是否开启自启动
- */
- private Integer taskBootUp;
-
- /**
- * 上次运行状态
- */
- private Integer taskLastRun;
-
- /**
- * 任务是否在内存中
- */
- private Integer taskRamStatus;
-
-
- public TaskEntity taskIsUse(Boolean isUse) {
- if(isUse) {
- this.taskIsUse = 1;
- }else {
- this.taskIsUse = 0;
- }
- return this;
- }
-
- public TaskEntity taskBootUp(Boolean isBootUp) {
- if(isBootUp) {
- this.taskBootUp = 1;
- }else {
- this.taskBootUp = 0;
- }
- return this;
- }
-
- public TaskEntity taskLastRun(Integer taskLastRun) {
- this.taskLastRun = taskLastRun;
- return this;
- }
-
- public TaskEntity taskRamStatus(Integer taskRamStatus) {
- this.taskRamStatus = taskRamStatus;
- return this;
- }
-
-
-
- public Boolean isUse(){
- if(null != this.taskIsUse && 1 == this.taskIsUse){
- return true;
- }
- return false;
- }
-
-
- public Boolean isBootUp(){
- if(null != this.taskBootUp && 1 == this.taskBootUp){
- return true;
- }
- return false;
- }
-
-
-
- public Map getNonNullProperties() {
- Map properties = new HashMap<>();
- if (taskDesc != null) properties.put("taskDesc", taskDesc);
- if (taskIsUse != null) properties.put("taskIsUse", taskIsUse);
- if (taskBootUp != null) properties.put("taskBootUp", taskBootUp);
- return properties;
- }
-
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
deleted file mode 100644
index 300d935..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.gcc.container.components.task.model.vo;
-
-
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 任务运行状态
- */
-@Data
-public class TaskRunRetVo implements Serializable {
-
-
- private String taskId;
-
-
- private String taskName;
-
-
- private TaskOperation taskOperation;
-
- /**
- * 执行状态
- * 1:成功
- * 0:失败
- */
- private Integer result;
-
-
- private String extend = "successful";
-
-
- public TaskRunRetVo(TaskOperation taskOperation, int result) {
- this.taskOperation = taskOperation;
- this.result = result;
- if(result == 0){
- this.extend = "fail";
- }
- }
-
- public TaskRunRetVo taskInfo(TaskEntity taskEntity){
- this.taskId = taskEntity.getTaskId();
- this.taskName = taskEntity.getTaskName();
- return this;
- }
-
- public TaskRunRetVo extend(Object extend){
- this.extend =String.valueOf(extend);
- return this;
- }
-
- public enum TaskOperation{
-
- //开启
- open,
-
- //关闭/停止
- shutdown,
-
- //更新任务
- update,
-
- //立即执行
- run;
- }
-
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
deleted file mode 100644
index 433c27a..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.gcc.container.components.task.model.vo;
-
-import lombok.Builder;
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-@Builder
-public class TaskVo implements Serializable {
-
- private String taskId;
-
- private String taskName;
-
- private String taskDesc;
-
- private String taskCron;
-
- /**
- * 任务相关配置
- */
- private String taskOutConfig;
-
- /**
- * 任务注册时间
- */
- private String taskCreateTime;
-
-
- /**
- * 是否开启自启动
- */
- private Integer taskBootUp;
-
- /**
- * 启停状态
- */
- private TaskRunStatus status;
-
-
- public enum TaskRunStatus{
- //开启
- open(1),
- //关闭
- shutdown(0);
-
- Integer code;
-
- TaskRunStatus(Integer code){
- this.code = code;
- }
- }
-
-}
--
Gitee
From 6a0eaa3d76b7e3efc5cc342496df4f057e2d2a69 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:57:28 +0000
Subject: [PATCH 11/14] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8A=A1?=
=?UTF-8?q?=E7=AD=89=E7=BA=A7=E6=9E=9A=E4=B8=BE=EF=BC=8C=E5=AE=9E=E4=BD=93?=
=?UTF-8?q?=E7=B1=BB=E5=8F=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../task/model/TaskVoConvertor.java | 40 ++++++
.../task/model/dto/SearchTaskDto.java | 28 ++++
.../task/model/entity/TaskEntity.java | 136 ++++++++++++++++++
.../task/model/enums/TaskLevel.java | 19 +++
.../task/model/vo/TaskRunRetVo.java | 70 +++++++++
.../components/task/model/vo/TaskVo.java | 55 +++++++
6 files changed, 348 insertions(+)
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/enums/TaskLevel.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java b/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
new file mode 100644
index 0000000..fe9089c
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/TaskVoConvertor.java
@@ -0,0 +1,40 @@
+package com.gcc.container.components.task.model;
+
+
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.model.vo.TaskVo;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class TaskVoConvertor {
+
+
+ public TaskVo toTaskVo(TaskEntity entity){
+ return TaskVo.builder()
+ .taskId(entity.getTaskId())
+ .taskName(entity.getTaskName())
+ .taskDesc(entity.getTaskDesc())
+ .taskCron(entity.getTaskCron())
+ .taskOutConfig(entity.getTaskOutConfig())
+ .taskBootUp(entity.getTaskBootUp())
+ .taskCreateTime(entity.getTaskCreateTime())
+ .status(ramStatusToRunStatus(entity.getTaskRamStatus()))
+ .build();
+ }
+
+ public List toTaskVos(List entities){
+ return entities.stream().map(this::toTaskVo).collect(Collectors.toList());
+ }
+
+ private TaskVo.TaskRunStatus ramStatusToRunStatus(Integer ramStatus){
+ if(1 == ramStatus){
+ return TaskVo.TaskRunStatus.open;
+ }else {
+ return TaskVo.TaskRunStatus.shutdown;
+ }
+ }
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java b/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
new file mode 100644
index 0000000..d4f352c
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/dto/SearchTaskDto.java
@@ -0,0 +1,28 @@
+package com.gcc.container.components.task.model.dto;
+
+import lombok.Data;
+import java.io.Serializable;
+
+
+/**
+ * 查询参数
+ */
+@Data
+public class SearchTaskDto implements Serializable {
+
+
+ private String filterKey;
+
+
+ private Boolean isBootUp;
+
+
+ private Integer lastRunStatus;
+
+
+ private Integer pageNo;
+
+
+ private Integer pageSize;
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java b/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
new file mode 100644
index 0000000..6b34ee2
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/entity/TaskEntity.java
@@ -0,0 +1,136 @@
+package com.gcc.container.components.task.model.entity;
+
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.gcc.container.components.task.model.enums.TaskLevel;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 任务实体类
+ * @author GCC
+ */
+@Data
+public class TaskEntity implements Serializable {
+
+ private String taskId;
+
+ private String taskName;
+
+ private String taskDesc;
+
+ private String taskCron;
+
+ private String taskClass;
+
+ /**
+ * 任务级别
+ */
+ private TaskLevel taskLevel;
+
+ /**
+ * 任务注册时间
+ */
+ private String taskCreateTime;
+
+ /**
+ * 是否启用
+ */
+ private Integer taskIsUse;
+
+ /**
+ * 是否开启自启动
+ */
+ private Integer taskBootUp;
+
+ /**
+ * 上次运行状态
+ */
+ private Integer taskLastRun;
+
+ /**
+ * 任务是否在内存中
+ */
+ private Integer taskRamStatus;
+
+
+ /**
+ * 外部配置
+ */
+ private String taskOutConfig;
+
+
+ /**
+ * 加载配置
+ */
+ private String loadConfigure;
+
+
+ public TaskEntity taskIsUse(Boolean isUse) {
+ if(isUse) {
+ this.taskIsUse = 1;
+ }else {
+ this.taskIsUse = 0;
+ }
+ return this;
+ }
+
+ public TaskEntity taskBootUp(Boolean isBootUp) {
+ if(isBootUp) {
+ this.taskBootUp = 1;
+ }else {
+ this.taskBootUp = 0;
+ }
+ return this;
+ }
+
+ public TaskEntity taskLastRun(Integer taskLastRun) {
+ this.taskLastRun = taskLastRun;
+ return this;
+ }
+
+ public TaskEntity taskRamStatus(Integer taskRamStatus) {
+ this.taskRamStatus = taskRamStatus;
+ return this;
+ }
+
+ public TaskEntity level(TaskLevel level){
+ this.taskLevel = level;
+ return this;
+ }
+
+
+ public Boolean isUse(){
+ if(null != this.taskIsUse && 1 == this.taskIsUse){
+ return true;
+ }
+ return false;
+ }
+
+
+ public Boolean isBootUp(){
+ if(null != this.taskBootUp && 1 == this.taskBootUp){
+ return true;
+ }
+ return false;
+ }
+
+
+
+ public Map getNonNullProperties() {
+ Map properties = new HashMap<>();
+ if (taskDesc != null) properties.put("taskDesc", taskDesc);
+ if (taskIsUse != null) properties.put("taskIsUse", taskIsUse);
+ if (taskBootUp != null) properties.put("taskBootUp", taskBootUp);
+ return properties;
+ }
+
+
+ public JSONObject getLoadConfiguration(){
+ return JSONUtil.parseObj(this.loadConfigure);
+ }
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/enums/TaskLevel.java b/task-component/src/main/java/com/gcc/container/components/task/model/enums/TaskLevel.java
new file mode 100644
index 0000000..d344c81
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/enums/TaskLevel.java
@@ -0,0 +1,19 @@
+package com.gcc.container.components.task.model.enums;
+
+/**
+ * 任务级别枚举
+ * @author GCC
+ */
+public enum TaskLevel {
+
+ /**
+ * 类级别
+ */
+ CLASS_LEVEL,
+
+ /**
+ * 方法级别
+ */
+ METHOD_LEVEL;
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
new file mode 100644
index 0000000..300d935
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskRunRetVo.java
@@ -0,0 +1,70 @@
+package com.gcc.container.components.task.model.vo;
+
+
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 任务运行状态
+ */
+@Data
+public class TaskRunRetVo implements Serializable {
+
+
+ private String taskId;
+
+
+ private String taskName;
+
+
+ private TaskOperation taskOperation;
+
+ /**
+ * 执行状态
+ * 1:成功
+ * 0:失败
+ */
+ private Integer result;
+
+
+ private String extend = "successful";
+
+
+ public TaskRunRetVo(TaskOperation taskOperation, int result) {
+ this.taskOperation = taskOperation;
+ this.result = result;
+ if(result == 0){
+ this.extend = "fail";
+ }
+ }
+
+ public TaskRunRetVo taskInfo(TaskEntity taskEntity){
+ this.taskId = taskEntity.getTaskId();
+ this.taskName = taskEntity.getTaskName();
+ return this;
+ }
+
+ public TaskRunRetVo extend(Object extend){
+ this.extend =String.valueOf(extend);
+ return this;
+ }
+
+ public enum TaskOperation{
+
+ //开启
+ open,
+
+ //关闭/停止
+ shutdown,
+
+ //更新任务
+ update,
+
+ //立即执行
+ run;
+ }
+
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
new file mode 100644
index 0000000..433c27a
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/model/vo/TaskVo.java
@@ -0,0 +1,55 @@
+package com.gcc.container.components.task.model.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+public class TaskVo implements Serializable {
+
+ private String taskId;
+
+ private String taskName;
+
+ private String taskDesc;
+
+ private String taskCron;
+
+ /**
+ * 任务相关配置
+ */
+ private String taskOutConfig;
+
+ /**
+ * 任务注册时间
+ */
+ private String taskCreateTime;
+
+
+ /**
+ * 是否开启自启动
+ */
+ private Integer taskBootUp;
+
+ /**
+ * 启停状态
+ */
+ private TaskRunStatus status;
+
+
+ public enum TaskRunStatus{
+ //开启
+ open(1),
+ //关闭
+ shutdown(0);
+
+ Integer code;
+
+ TaskRunStatus(Integer code){
+ this.code = code;
+ }
+ }
+
+}
--
Gitee
From 16f579fb3ed9bc8250ce5a1b92daf4a20cf8b541 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:57:56 +0000
Subject: [PATCH 12/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/se?=
=?UTF-8?q?rvice?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../task/service/AfterAppStarted.java | 29 ----
.../service/TaskScheduleManagerService.java | 55 -------
.../impl/TaskScheduleManagerServiceImpl.java | 142 ------------------
3 files changed, 226 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java b/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
deleted file mode 100644
index 00e270b..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.gcc.container.components.task.service;
-
-
-
-import com.gcc.container.components.task.compont.TaskSchedule;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.event.ApplicationReadyEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.stereotype.Component;
-
-@Component
-@Slf4j
-public class AfterAppStarted {
-
- TaskSchedule taskSchedule;
-
- @Autowired
- public void setTaskScheduleServer(TaskSchedule taskSchedule) {
- this.taskSchedule = taskSchedule;
- }
-
- @EventListener
- public void onApplicationEvent(ApplicationReadyEvent event){
- log.info("【定时任务自运行】运行开机自启动任务");
- //运行随系统启动的定时任务
- taskSchedule.runBootUpTask();
- }
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java b/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
deleted file mode 100644
index ec07f9c..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.gcc.container.components.task.service;
-
-import com.gcc.container.components.task.model.dto.SearchTaskDto;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import com.gcc.container.components.task.model.vo.TaskRunRetVo;
-import com.gcc.container.components.task.model.vo.TaskVo;
-import java.util.List;
-public interface TaskScheduleManagerService {
-
- /**
- * 查询在用任务
- * @return
- */
- List searchTask(SearchTaskDto dto);
-
- /**
- * 查询任务详情
- * @param taskId 任务id
- * @return TaskEntity
- */
- TaskVo searchTaskDetail(String taskId);
-
-
- /**
- * 运行指定任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo runTask(String taskId);
-
-
- /**
- * 关停任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo shutdownTask(String taskId);
-
-
- /**
- * 开启任务
- * @param taskId 任务id
- * @return TaskRunRetDto
- */
- TaskRunRetVo openTask(String taskId);
-
-
- /**
- * 更新任务信息
- * @param entity 实体
- * @return TaskRunRetDto
- */
- TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity);
-
-}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java b/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
deleted file mode 100644
index e0c0ba5..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package com.gcc.container.components.task.service.impl;
-
-import cn.hutool.json.JSONUtil;
-import com.gcc.container.components.task.compont.AbstractBaseCronTask;
-import com.gcc.container.components.task.compont.TaskSchedule;
-import com.gcc.container.components.task.dao.TaskRepository;
-import com.gcc.container.components.task.model.TaskVoConvertor;
-import com.gcc.container.components.task.model.dto.SearchTaskDto;
-import com.gcc.container.components.task.model.entity.TaskEntity;
-import com.gcc.container.components.task.model.vo.TaskRunRetVo;
-import com.gcc.container.components.task.model.vo.TaskVo;
-import com.gcc.container.components.task.service.TaskScheduleManagerService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-
-import java.util.List;
-
-
-@Component
-public class TaskScheduleManagerServiceImpl implements TaskScheduleManagerService {
-
-
- private TaskSchedule taskSchedule;
-
- private TaskRepository taskRepository;
-
- private TaskVoConvertor taskVoConvertor;
-
- @Autowired
- public void setTaskScheduleServer(TaskSchedule taskSchedule) {
- this.taskSchedule = taskSchedule;
- }
-
- @Autowired
- public void setTaskRepository(TaskRepository taskRepository) {
- this.taskRepository = taskRepository;
- }
-
- @Autowired
- public void setTaskVoConvertor(TaskVoConvertor taskVoConvertor) {
- this.taskVoConvertor = taskVoConvertor;
- }
-
- @Override
- public List searchTask(SearchTaskDto dto) {
- TaskEntity entity = new TaskEntity()
- .taskIsUse(true)
- .taskBootUp(dto.getIsBootUp())
- .taskLastRun(dto.getLastRunStatus());
- entity.setTaskDesc(dto.getFilterKey());
- return taskVoConvertor.toTaskVos(taskRepository.queryData(entity));
- }
-
-
- @Override
- public TaskVo searchTaskDetail(String taskId) {
- if(!StringUtils.isEmpty(taskId)){
- return taskVoConvertor.toTaskVo(taskRepository.queryData(taskId));
- }
- return null;
- }
-
-
- @Override
- public TaskRunRetVo runTask(String taskId) {
- AbstractBaseCronTask task = taskSchedule.getTaskSchedulingRam().get(taskId);
- TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.run, 0);
- if(null != task) {
- double time = taskSchedule.runTaskById(taskId);
- result.setResult(1);
- return result.extend(time).taskInfo(task.getThisTaskInfo());
- } else {
- return result.extend("任务未启用");
- }
- }
-
- @Override
- public TaskRunRetVo shutdownTask(String taskId) {
- AbstractBaseCronTask task = taskSchedule.getTaskSchedulingRam().get(taskId);
- TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.shutdown, 0);
- if(null != task) {
- boolean flag = taskSchedule.removeTaskFromScheduling(taskId);
- if(flag) {
- result.setResult(1);
- }
- return result.extend("任务成功关闭").taskInfo(task.getThisTaskInfo());
- } else {
- return result.extend("任务未启用");
- }
- }
-
- @Override
- public TaskRunRetVo openTask(String taskId) {
- TaskEntity task = taskRepository.queryData(taskId);
- TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.open, 0);
- if(null != task) {
- if (!taskSchedule.getTaskSchedulingRam().containsKey(taskId)) {
- boolean flag = taskSchedule.addTaskToScheduling(task);
- if(flag) {
- result.setResult(1);
- }
- return result.extend("任务开启成功").taskInfo(task);
- } else {
- return result.extend("任务处于启动状态").taskInfo(task);
- }
- }else {
- return result.extend("任务不存在!");
- }
- }
-
- @Override
- public TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity) {
- TaskEntity task = taskRepository.queryData(entity.getTaskId());
- TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.update, 0).taskInfo(entity);
- String config = entity.getTaskOutConfig();
- if(null != config && !JSONUtil.isJson(config) && !JSONUtil.isJsonArray(config)){
- result.setResult(0);
- result.extend("更新任务失败,任务配置必须为JSON或空");
- result.taskInfo(entity);
- return result;
- }
- task.setTaskCron(entity.getTaskCron());
- task.setTaskOutConfig(entity.getTaskOutConfig());
- task.setTaskName(entity.getTaskName());
- task.setTaskDesc(entity.getTaskDesc());
- int num = taskRepository.update(task);
- if (num == 1) {
- result.setResult(1);
- result.extend("成功更新任务");
- result.taskInfo(entity);
- //重新刷新任务
- taskSchedule.removeTaskFromScheduling(entity.getTaskId());
- taskSchedule.addTaskToScheduling(task);
- }
-
- return result;
- }
-
-
-
-}
--
Gitee
From 02b9dce267f04e5cce395e9e10fe3cf31be6a255 Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:58:03 +0000
Subject: [PATCH 13/14] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20ta?=
=?UTF-8?q?sk-component/src/main/java/com/gcc/container/components/task/pr?=
=?UTF-8?q?operty?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../task/property/TaskDataProperties.java | 25 -------------------
1 file changed, 25 deletions(-)
delete mode 100644 task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java b/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
deleted file mode 100644
index 20f6cb1..0000000
--- a/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.gcc.container.components.task.property;
-
-import cn.hutool.core.util.StrUtil;
-import lombok.Data;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-@Configuration
-@ConfigurationProperties("gcc-task")
-@Data
-public class TaskDataProperties {
-
-
- private String dataFilePath;
-
-
- private String taskClassPackage;
-
- public String getTaskClassPackage() {
- if(StrUtil.isBlankIfStr(this.taskClassPackage)){
- return "*";
- }
- return taskClassPackage;
- }
-}
--
Gitee
From 8ca103ee2904201ab35e8856fdb3b3851516306e Mon Sep 17 00:00:00 2001
From: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
Date: Tue, 19 Nov 2024 08:58:29 +0000
Subject: [PATCH 14/14] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=8F=8A=E5=BC=80=E6=9C=BA=E8=87=AA=E5=90=AF=E5=8A=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: GCC1566 <8714475+gcc1566@user.noreply.gitee.com>
---
.../task/property/TaskDataProperties.java | 25 +++
.../task/service/AfterAppStarted.java | 29 ++++
.../service/TaskScheduleManagerService.java | 55 +++++++
.../impl/TaskScheduleManagerServiceImpl.java | 142 ++++++++++++++++++
4 files changed, 251 insertions(+)
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
create mode 100644 task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
diff --git a/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java b/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
new file mode 100644
index 0000000..20f6cb1
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/property/TaskDataProperties.java
@@ -0,0 +1,25 @@
+package com.gcc.container.components.task.property;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConfigurationProperties("gcc-task")
+@Data
+public class TaskDataProperties {
+
+
+ private String dataFilePath;
+
+
+ private String taskClassPackage;
+
+ public String getTaskClassPackage() {
+ if(StrUtil.isBlankIfStr(this.taskClassPackage)){
+ return "*";
+ }
+ return taskClassPackage;
+ }
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java b/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
new file mode 100644
index 0000000..00e270b
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/service/AfterAppStarted.java
@@ -0,0 +1,29 @@
+package com.gcc.container.components.task.service;
+
+
+
+import com.gcc.container.components.task.compont.TaskSchedule;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class AfterAppStarted {
+
+ TaskSchedule taskSchedule;
+
+ @Autowired
+ public void setTaskScheduleServer(TaskSchedule taskSchedule) {
+ this.taskSchedule = taskSchedule;
+ }
+
+ @EventListener
+ public void onApplicationEvent(ApplicationReadyEvent event){
+ log.info("【定时任务自运行】运行开机自启动任务");
+ //运行随系统启动的定时任务
+ taskSchedule.runBootUpTask();
+ }
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java b/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
new file mode 100644
index 0000000..ec07f9c
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/service/TaskScheduleManagerService.java
@@ -0,0 +1,55 @@
+package com.gcc.container.components.task.service;
+
+import com.gcc.container.components.task.model.dto.SearchTaskDto;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.model.vo.TaskRunRetVo;
+import com.gcc.container.components.task.model.vo.TaskVo;
+import java.util.List;
+public interface TaskScheduleManagerService {
+
+ /**
+ * 查询在用任务
+ * @return
+ */
+ List searchTask(SearchTaskDto dto);
+
+ /**
+ * 查询任务详情
+ * @param taskId 任务id
+ * @return TaskEntity
+ */
+ TaskVo searchTaskDetail(String taskId);
+
+
+ /**
+ * 运行指定任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo runTask(String taskId);
+
+
+ /**
+ * 关停任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo shutdownTask(String taskId);
+
+
+ /**
+ * 开启任务
+ * @param taskId 任务id
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo openTask(String taskId);
+
+
+ /**
+ * 更新任务信息
+ * @param entity 实体
+ * @return TaskRunRetDto
+ */
+ TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity);
+
+}
diff --git a/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java b/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
new file mode 100644
index 0000000..e0c0ba5
--- /dev/null
+++ b/task-component/src/main/java/com/gcc/container/components/task/service/impl/TaskScheduleManagerServiceImpl.java
@@ -0,0 +1,142 @@
+package com.gcc.container.components.task.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.gcc.container.components.task.compont.AbstractBaseCronTask;
+import com.gcc.container.components.task.compont.TaskSchedule;
+import com.gcc.container.components.task.dao.TaskRepository;
+import com.gcc.container.components.task.model.TaskVoConvertor;
+import com.gcc.container.components.task.model.dto.SearchTaskDto;
+import com.gcc.container.components.task.model.entity.TaskEntity;
+import com.gcc.container.components.task.model.vo.TaskRunRetVo;
+import com.gcc.container.components.task.model.vo.TaskVo;
+import com.gcc.container.components.task.service.TaskScheduleManagerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+
+@Component
+public class TaskScheduleManagerServiceImpl implements TaskScheduleManagerService {
+
+
+ private TaskSchedule taskSchedule;
+
+ private TaskRepository taskRepository;
+
+ private TaskVoConvertor taskVoConvertor;
+
+ @Autowired
+ public void setTaskScheduleServer(TaskSchedule taskSchedule) {
+ this.taskSchedule = taskSchedule;
+ }
+
+ @Autowired
+ public void setTaskRepository(TaskRepository taskRepository) {
+ this.taskRepository = taskRepository;
+ }
+
+ @Autowired
+ public void setTaskVoConvertor(TaskVoConvertor taskVoConvertor) {
+ this.taskVoConvertor = taskVoConvertor;
+ }
+
+ @Override
+ public List searchTask(SearchTaskDto dto) {
+ TaskEntity entity = new TaskEntity()
+ .taskIsUse(true)
+ .taskBootUp(dto.getIsBootUp())
+ .taskLastRun(dto.getLastRunStatus());
+ entity.setTaskDesc(dto.getFilterKey());
+ return taskVoConvertor.toTaskVos(taskRepository.queryData(entity));
+ }
+
+
+ @Override
+ public TaskVo searchTaskDetail(String taskId) {
+ if(!StringUtils.isEmpty(taskId)){
+ return taskVoConvertor.toTaskVo(taskRepository.queryData(taskId));
+ }
+ return null;
+ }
+
+
+ @Override
+ public TaskRunRetVo runTask(String taskId) {
+ AbstractBaseCronTask task = taskSchedule.getTaskSchedulingRam().get(taskId);
+ TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.run, 0);
+ if(null != task) {
+ double time = taskSchedule.runTaskById(taskId);
+ result.setResult(1);
+ return result.extend(time).taskInfo(task.getThisTaskInfo());
+ } else {
+ return result.extend("任务未启用");
+ }
+ }
+
+ @Override
+ public TaskRunRetVo shutdownTask(String taskId) {
+ AbstractBaseCronTask task = taskSchedule.getTaskSchedulingRam().get(taskId);
+ TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.shutdown, 0);
+ if(null != task) {
+ boolean flag = taskSchedule.removeTaskFromScheduling(taskId);
+ if(flag) {
+ result.setResult(1);
+ }
+ return result.extend("任务成功关闭").taskInfo(task.getThisTaskInfo());
+ } else {
+ return result.extend("任务未启用");
+ }
+ }
+
+ @Override
+ public TaskRunRetVo openTask(String taskId) {
+ TaskEntity task = taskRepository.queryData(taskId);
+ TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.open, 0);
+ if(null != task) {
+ if (!taskSchedule.getTaskSchedulingRam().containsKey(taskId)) {
+ boolean flag = taskSchedule.addTaskToScheduling(task);
+ if(flag) {
+ result.setResult(1);
+ }
+ return result.extend("任务开启成功").taskInfo(task);
+ } else {
+ return result.extend("任务处于启动状态").taskInfo(task);
+ }
+ }else {
+ return result.extend("任务不存在!");
+ }
+ }
+
+ @Override
+ public TaskRunRetVo updateTaskBusinessInfo(TaskEntity entity) {
+ TaskEntity task = taskRepository.queryData(entity.getTaskId());
+ TaskRunRetVo result = new TaskRunRetVo(TaskRunRetVo.TaskOperation.update, 0).taskInfo(entity);
+ String config = entity.getTaskOutConfig();
+ if(null != config && !JSONUtil.isJson(config) && !JSONUtil.isJsonArray(config)){
+ result.setResult(0);
+ result.extend("更新任务失败,任务配置必须为JSON或空");
+ result.taskInfo(entity);
+ return result;
+ }
+ task.setTaskCron(entity.getTaskCron());
+ task.setTaskOutConfig(entity.getTaskOutConfig());
+ task.setTaskName(entity.getTaskName());
+ task.setTaskDesc(entity.getTaskDesc());
+ int num = taskRepository.update(task);
+ if (num == 1) {
+ result.setResult(1);
+ result.extend("成功更新任务");
+ result.taskInfo(entity);
+ //重新刷新任务
+ taskSchedule.removeTaskFromScheduling(entity.getTaskId());
+ taskSchedule.addTaskToScheduling(task);
+ }
+
+ return result;
+ }
+
+
+
+}
--
Gitee