From a3241d84692dac8e106215e5132a8b2932273c6e Mon Sep 17 00:00:00 2001 From: Xiang Date: Wed, 11 Feb 2026 15:23:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=8A=A8=E6=80=81=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- xservice-quartz-admin/pom.xml | 7 ++ .../domain/convert/DynamicTaskConvert.java | 67 +++++++++++ .../admin/domain/entity/DynamicTaskDO.java | 47 ++++++++ .../admin/manage/DynamicTaskManageImpl.java | 20 ++++ .../admin/manage/IDynamicTaskManage.java | 15 +++ .../admin/mapper/IScheduledTaskMapper.java | 22 ++++ .../admin/server/DynamicTaskController.java | 49 ++++++++ .../admin/server/XxzJobFetchController.java | 8 +- .../admin/service/IDynamicTaskService.java | 19 ++++ .../impl/DynamicTaskSchedulerServiceImpl.java | 40 +++++++ .../resources/mapper/ScheduledTaskMapper.xml | 62 ++++++++++ .../quartz/common/api/DynamicTaskApi.java | 44 +++++++ .../request/DynamicTaskQueryRequest.java | 33 ++++++ .../request/DynamicTaskSaveRequest.java | 45 ++++++++ .../request/DynamicTaskUpdateRequest.java | 45 ++++++++ .../response/DynamicTaskInfoResponse.java | 58 ++++++++++ .../quartz/common/enums/TaskStatusEnum.java | 21 ++++ .../common/enums/url/DynamicTaskUrlEnum.java | 26 +++++ xservice-quartz-core/pom.xml | 10 +- .../xiang/core/quartz/api/AdminJobClient.java | 1 - .../api/HttpDynamicTaskClientImpl.java | 62 ++++++++++ .../DynamicSchedulerAutoConfiguration.java | 12 ++ .../config/DynamicTaskSchedulerConfig.java | 19 ++++ .../schedule/core/DynamicTaskScheduler.java | 51 +++++++++ .../core/schedule/core/TaskRegistry.java | 21 ++++ .../core/schedule/entity/TaskConfig.java | 19 ++++ .../core/schedule/enums/TaskGroupEnum.java | 17 +++ .../core/schedule/helper/TaskExecutor.java | 8 ++ .../DynamicTaskSchedulerServiceImpl.java | 107 ++++++++++++++++++ .../service/IDynamicTaskSchedulerService.java | 21 ++++ .../main/resources/META-INF/spring.factories | 3 +- xservice-quartz-sample/pom.xml | 2 +- .../springboot/server/TestController.java | 23 ++++ .../task/sample/springboot/task/TestTask.java | 31 +++++ .../springboot/task/TestTaskService.java | 38 +++++++ 36 files changed, 1065 insertions(+), 10 deletions(-) create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/convert/DynamicTaskConvert.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/entity/DynamicTaskDO.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/DynamicTaskManageImpl.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/IDynamicTaskManage.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/mapper/IScheduledTaskMapper.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/DynamicTaskController.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/IDynamicTaskService.java create mode 100644 xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/impl/DynamicTaskSchedulerServiceImpl.java create mode 100644 xservice-quartz-admin/src/main/resources/mapper/ScheduledTaskMapper.xml create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/api/DynamicTaskApi.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskQueryRequest.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskSaveRequest.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskUpdateRequest.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/response/DynamicTaskInfoResponse.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/TaskStatusEnum.java create mode 100644 xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/url/DynamicTaskUrlEnum.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/api/HttpDynamicTaskClientImpl.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicSchedulerAutoConfiguration.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicTaskSchedulerConfig.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/DynamicTaskScheduler.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/TaskRegistry.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/entity/TaskConfig.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/enums/TaskGroupEnum.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/helper/TaskExecutor.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/DynamicTaskSchedulerServiceImpl.java create mode 100644 xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/IDynamicTaskSchedulerService.java create mode 100644 xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/server/TestController.java create mode 100644 xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTask.java create mode 100644 xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTaskService.java diff --git a/pom.xml b/pom.xml index 5cf415e..2576094 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ com.xiang.starter xmc-common - 1.0 + 1.1 com.xiang.starter diff --git a/xservice-quartz-admin/pom.xml b/xservice-quartz-admin/pom.xml index a2a4326..30e7c06 100644 --- a/xservice-quartz-admin/pom.xml +++ b/xservice-quartz-admin/pom.xml @@ -18,6 +18,13 @@ 17 UTF-8 + + + com.xiang.starter + xservice-quartz-common + 1.0-SNAPSHOT + + diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/convert/DynamicTaskConvert.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/convert/DynamicTaskConvert.java new file mode 100644 index 0000000..cbfa350 --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/convert/DynamicTaskConvert.java @@ -0,0 +1,67 @@ +package com.xiang.app.quartz.admin.domain.convert; + +import com.xiang.app.quartz.admin.domain.entity.DynamicTaskDO; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 11:14 + */ +public class DynamicTaskConvert { + public static DynamicTaskDO convert(DynamicTaskSaveRequest request) { + DynamicTaskDO dynamicTaskDO = new DynamicTaskDO(); + dynamicTaskDO.setId(request.getId()); + dynamicTaskDO.setTaskName(request.getTaskName()); + dynamicTaskDO.setTaskGroup(request.getTaskGroup()); + dynamicTaskDO.setRunTime(request.getRunTime()); + dynamicTaskDO.setStatus(request.getStatus()); + dynamicTaskDO.setParameters(request.getParameters()); + dynamicTaskDO.setCreateTime(LocalDateTime.now()); + dynamicTaskDO.setUpdateTime(LocalDateTime.now()); + return dynamicTaskDO; + } + + public static DynamicTaskDO convert(DynamicTaskUpdateRequest request) { + DynamicTaskDO dynamicTaskDO = new DynamicTaskDO(); + dynamicTaskDO.setId(request.getId()); + dynamicTaskDO.setTaskName(request.getTaskName()); + dynamicTaskDO.setTaskGroup(request.getTaskGroup()); + dynamicTaskDO.setRunTime(request.getRunTime()); + dynamicTaskDO.setStatus(request.getStatus()); + dynamicTaskDO.setParameters(request.getParameters()); + dynamicTaskDO.setUpdateTime(LocalDateTime.now()); + return dynamicTaskDO; + } + + public static DynamicTaskDO convert(DynamicTaskQueryRequest request) { + DynamicTaskDO dynamicTaskDO = new DynamicTaskDO(); + dynamicTaskDO.setTaskName(request.getTaskName()); + dynamicTaskDO.setTaskGroup(request.getTaskGroup()); + dynamicTaskDO.setStatus(request.getStatus()); + return dynamicTaskDO; + } + + public static DynamicTaskInfoResponse convert(DynamicTaskDO entity) { + DynamicTaskInfoResponse dynamicTaskInfoResponse = new DynamicTaskInfoResponse(); + dynamicTaskInfoResponse.setId(entity.getId()); + dynamicTaskInfoResponse.setTaskName(entity.getTaskName()); + dynamicTaskInfoResponse.setTaskGroup(entity.getTaskGroup()); + dynamicTaskInfoResponse.setRunTime(entity.getRunTime()); + dynamicTaskInfoResponse.setStatus(entity.getStatus()); + dynamicTaskInfoResponse.setParameters(entity.getParameters()); + dynamicTaskInfoResponse.setCreatedTime(entity.getCreateTime()); + dynamicTaskInfoResponse.setUpdatedTime(entity.getUpdateTime()); + return dynamicTaskInfoResponse; + } + + public static List convertList(List list) { + return list.stream().map(DynamicTaskConvert::convert).toList(); + } + +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/entity/DynamicTaskDO.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/entity/DynamicTaskDO.java new file mode 100644 index 0000000..9f4970f --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/domain/entity/DynamicTaskDO.java @@ -0,0 +1,47 @@ +package com.xiang.app.quartz.admin.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@TableName("xmc_dynamic_task") +public class DynamicTaskDO { + /** + * id + */ + private Long id; + /** + * 任务名称 + */ + private String taskName; + /** + * 任务分组 + */ + private String taskGroup; + /** + * 运行时间 + */ + private LocalDateTime runTime; + /** + * 任务状态 + */ + private Integer status; + /** + * 参数 + */ + private String parameters; + /** + * 创建时间 + */ + private LocalDateTime createTime; + /** + * 修改时间 + */ + private LocalDateTime updateTime; +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/DynamicTaskManageImpl.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/DynamicTaskManageImpl.java new file mode 100644 index 0000000..5c4838d --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/DynamicTaskManageImpl.java @@ -0,0 +1,20 @@ +package com.xiang.app.quartz.admin.manage; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xiang.app.quartz.admin.domain.entity.DynamicTaskDO; +import com.xiang.app.quartz.admin.mapper.IScheduledTaskMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 09:57 + */ +@Service +public class DynamicTaskManageImpl extends ServiceImpl implements IDynamicTaskManage { + @Override + public List getByList(DynamicTaskDO entity) { + return baseMapper.getTaskList(entity); + } +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/IDynamicTaskManage.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/IDynamicTaskManage.java new file mode 100644 index 0000000..4dd540e --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/manage/IDynamicTaskManage.java @@ -0,0 +1,15 @@ +package com.xiang.app.quartz.admin.manage; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xiang.app.quartz.admin.domain.entity.DynamicTaskDO; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 09:57 + */ +public interface IDynamicTaskManage extends IService { + + List getByList(DynamicTaskDO entity); +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/mapper/IScheduledTaskMapper.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/mapper/IScheduledTaskMapper.java new file mode 100644 index 0000000..b20180a --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/mapper/IScheduledTaskMapper.java @@ -0,0 +1,22 @@ +package com.xiang.app.quartz.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xiang.app.quartz.admin.domain.entity.DynamicTaskDO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Mapper +@Repository +public interface IScheduledTaskMapper extends BaseMapper { + + int save(DynamicTaskDO entity); + + int update(DynamicTaskDO entity); + + DynamicTaskDO getTask(@Param("id") Long taskId); + + List getTaskList(DynamicTaskDO entity); +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/DynamicTaskController.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/DynamicTaskController.java new file mode 100644 index 0000000..82cd9f6 --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/DynamicTaskController.java @@ -0,0 +1,49 @@ +package com.xiang.app.quartz.admin.server; + +import com.xiang.app.quartz.admin.service.IDynamicTaskService; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; +import com.xiang.xservice.basic.common.resp.Result; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:22 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/open/dynamic/task") +public class DynamicTaskController { + + private final IDynamicTaskService dynamicTaskService; + + @PostMapping("/save") + public Result saveTask(@RequestBody DynamicTaskSaveRequest request) { + dynamicTaskService.saveTask(request); + return Result.success(); + } + @PostMapping("/update") + public Result updateTask(@RequestBody DynamicTaskUpdateRequest request) { + dynamicTaskService.updateTask(request); + return Result.success(); + } + @GetMapping("/info/{id}") + public Result info(@PathVariable("id") Long id) { + return Result.data(dynamicTaskService.getTask(id)); + } + @PostMapping("/getList") + public Result> list(@RequestBody DynamicTaskQueryRequest request) { + return Result.data(dynamicTaskService.getTaskList(request)); + } + +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/XxzJobFetchController.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/XxzJobFetchController.java index c37070c..519c166 100644 --- a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/XxzJobFetchController.java +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/server/XxzJobFetchController.java @@ -22,15 +22,15 @@ public class XxzJobFetchController { private final ITaskConfigService taskConfigService; @GetMapping("/list") - public Result list(@RequestParam("appName") String appName, @RequestParam("env") Long env) { + public Result> list(@RequestParam("appName") String appName, @RequestParam("env") Long env) { List jobsByAppName = taskConfigService.getJobsByAppName(appName, env); - return Result.success(jobsByAppName); + return Result.data(jobsByAppName); } @GetMapping("/listByVersion") - public Result listByVersion(@RequestParam("appName") String appName, + public Result> listByVersion(@RequestParam("appName") String appName, @RequestParam("currVersion") Integer currVersion, @RequestParam("env") Long env) { - return Result.success(taskConfigService.getJobsByAppNameAndVersion(appName, currVersion, env)); + return Result.data(taskConfigService.getJobsByAppNameAndVersion(appName, currVersion, env)); } } diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/IDynamicTaskService.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/IDynamicTaskService.java new file mode 100644 index 0000000..b8cc251 --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/IDynamicTaskService.java @@ -0,0 +1,19 @@ +package com.xiang.app.quartz.admin.service; + +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 09:56 + */ +public interface IDynamicTaskService { + Boolean saveTask(DynamicTaskSaveRequest entity); + Boolean updateTask(DynamicTaskUpdateRequest entity); + DynamicTaskInfoResponse getTask(Long taskId); + List getTaskList(DynamicTaskQueryRequest entity); +} diff --git a/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/impl/DynamicTaskSchedulerServiceImpl.java b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/impl/DynamicTaskSchedulerServiceImpl.java new file mode 100644 index 0000000..6c15507 --- /dev/null +++ b/xservice-quartz-admin/src/main/java/com/xiang/app/quartz/admin/service/impl/DynamicTaskSchedulerServiceImpl.java @@ -0,0 +1,40 @@ +package com.xiang.app.quartz.admin.service.impl; + +import com.xiang.app.quartz.admin.domain.convert.DynamicTaskConvert; +import com.xiang.app.quartz.admin.manage.IDynamicTaskManage; +import com.xiang.app.quartz.admin.service.IDynamicTaskService; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskService { + + private final IDynamicTaskManage dynamicTaskManage; + + @Override + public Boolean saveTask(DynamicTaskSaveRequest entity) { + return dynamicTaskManage.save(DynamicTaskConvert.convert(entity)); + } + + @Override + public Boolean updateTask(DynamicTaskUpdateRequest entity) { + return dynamicTaskManage.updateById(DynamicTaskConvert.convert(entity)); + } + + @Override + public DynamicTaskInfoResponse getTask(Long taskId) { + return DynamicTaskConvert.convert(dynamicTaskManage.getById(taskId)); + } + + @Override + public List getTaskList(DynamicTaskQueryRequest entity) { + return DynamicTaskConvert.convertList(dynamicTaskManage.getByList(DynamicTaskConvert.convert(entity))); + } +} diff --git a/xservice-quartz-admin/src/main/resources/mapper/ScheduledTaskMapper.xml b/xservice-quartz-admin/src/main/resources/mapper/ScheduledTaskMapper.xml new file mode 100644 index 0000000..7c81026 --- /dev/null +++ b/xservice-quartz-admin/src/main/resources/mapper/ScheduledTaskMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + id, task_name, task_group, run_time, status, parameters, create_time, update_time + + + + + INSERT INTO script_schedule_task (id, task_name, task_group, run_time, status, parameters, create_time, update_time) + VALUES (#{id}, #{taskName}, #{taskGroup}, #{runTime}, #{status}, #{parameters}, #{createdTime}, #{updatedTime}) + + + + + UPDATE script_schedule_task + SET task_name = #{taskName}, + task_group = #{taskGroup}, + run_time = #{runTime}, + status = #{status}, + parameters = #{parameters}, + create_time = #{createdTime}, + update_time = #{updatedTime} + WHERE id = #{id} + + + + + + \ No newline at end of file diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/api/DynamicTaskApi.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/api/DynamicTaskApi.java new file mode 100644 index 0000000..2b2ac00 --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/api/DynamicTaskApi.java @@ -0,0 +1,44 @@ +package com.xiang.quartz.common.api; + +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; +import com.xiang.xservice.basic.common.resp.Result; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:59 + */ +public interface DynamicTaskApi { + + /** + * 保存任务 + * @param request 新增请求 + * @return + */ + Result saveTask(DynamicTaskSaveRequest request); + + /** + * 修改任务 + * @param request 修改请求 + * @return + */ + Result updateTask(DynamicTaskUpdateRequest request); + + /** + * 查询任务详情 + * @param id 任务id + * @return 任务详情 + */ + Result info(Long id); + + /** + * 查询任务列表 + * @param request 查询参数 + * @return 任务列表 + */ + Result> list(DynamicTaskQueryRequest request); +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskQueryRequest.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskQueryRequest.java new file mode 100644 index 0000000..854fab9 --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskQueryRequest.java @@ -0,0 +1,33 @@ +package com.xiang.quartz.common.entity.dynamic.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2026-02-11 11:10 + */ +@Data +public class DynamicTaskQueryRequest { + /** + * 任务名称 + */ + private String taskName; + /** + * 任务分组 + */ + private String taskGroup; + /** + * 运行时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime runTime; + /** + * 任务状态 + */ + private Integer status; +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskSaveRequest.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskSaveRequest.java new file mode 100644 index 0000000..04bd8e6 --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskSaveRequest.java @@ -0,0 +1,45 @@ +package com.xiang.quartz.common.entity.dynamic.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:55 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicTaskSaveRequest { + /** + * 任务id + */ + private Long id; + /** + * 任务名称 + */ + private String taskName; + /** + * 任务分组 + */ + private String taskGroup; + /** + * 运行时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime runTime; + /** + * 任务状态 + */ + private Integer status; + /** + * 参数 + */ + private String parameters; +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskUpdateRequest.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskUpdateRequest.java new file mode 100644 index 0000000..8fb228c --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/request/DynamicTaskUpdateRequest.java @@ -0,0 +1,45 @@ +package com.xiang.quartz.common.entity.dynamic.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:57 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicTaskUpdateRequest { + /** + * id + */ + private Long id; + /** + * 任务名称 + */ + private String taskName; + /** + * 任务分组 + */ + private String taskGroup; + /** + * 运行时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime runTime; + /** + * 任务状态 + */ + private Integer status; + /** + * 参数 + */ + private String parameters; +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/response/DynamicTaskInfoResponse.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/response/DynamicTaskInfoResponse.java new file mode 100644 index 0000000..862d2ef --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/entity/dynamic/response/DynamicTaskInfoResponse.java @@ -0,0 +1,58 @@ +package com.xiang.quartz.common.entity.dynamic.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:58 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DynamicTaskInfoResponse { + + /** + * id + */ + private Long id; + /** + * 任务名称 + */ + private String taskName; + /** + * 任务分组 + */ + private String taskGroup; + /** + * 运行时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime runTime; + /** + * 任务状态 + */ + private Integer status; + /** + * 参数 + */ + private String parameters; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdTime; + /** + * 修改时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedTime; +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/TaskStatusEnum.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/TaskStatusEnum.java new file mode 100644 index 0000000..61d6f85 --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/TaskStatusEnum.java @@ -0,0 +1,21 @@ +package com.xiang.quartz.common.enums; + +import lombok.Getter; + +@Getter +public enum TaskStatusEnum { + UN_START(1, "未开始"), + PROCEED(2, "进行中"), + FINISHED(3, "已完成"), + CANCELED(4, "取消"), + ERROR(5, "错误"), + ; + + private final Integer code; + private final String desc; + + TaskStatusEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/url/DynamicTaskUrlEnum.java b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/url/DynamicTaskUrlEnum.java new file mode 100644 index 0000000..8779e81 --- /dev/null +++ b/xservice-quartz-common/src/main/java/com/xiang/quartz/common/enums/url/DynamicTaskUrlEnum.java @@ -0,0 +1,26 @@ +package com.xiang.quartz.common.enums.url; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpMethod; + +/** + * @Author: xiang + * @Date: 2026-02-11 11:24 + */ +@Getter +@AllArgsConstructor +public enum DynamicTaskUrlEnum { + + + + SAVE_TASK("/open/dynamic/task/save", "保存任务", HttpMethod.POST), + UPDATE_TASK("/open/dynamic/task/update", "保存任务",HttpMethod.POST), + QUERY_TASK_INFO("/open/dynamic/task/info/", "查询任务详情", HttpMethod.GET), + QUERY_TASK_LIST("/open/dynamic/task/list", "查询任务列表", HttpMethod.POST), + + ; + private final String url; + private final String desc; + private final HttpMethod method; +} diff --git a/xservice-quartz-core/pom.xml b/xservice-quartz-core/pom.xml index 69d2abc..dd77597 100644 --- a/xservice-quartz-core/pom.xml +++ b/xservice-quartz-core/pom.xml @@ -11,7 +11,7 @@ com.xiang.starter xservice-quartz-core - 1.1 + 1.2 17 @@ -20,10 +20,16 @@ + + com.xiang.starter + xservice-quartz-common + 1.0-SNAPSHOT + + com.xiang.starter xmc-common - 1.0 + 1.1 com.xiang.starter diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/quartz/api/AdminJobClient.java b/xservice-quartz-core/src/main/java/com/xiang/core/quartz/api/AdminJobClient.java index 2dcc417..dae9c94 100644 --- a/xservice-quartz-core/src/main/java/com/xiang/core/quartz/api/AdminJobClient.java +++ b/xservice-quartz-core/src/main/java/com/xiang/core/quartz/api/AdminJobClient.java @@ -13,6 +13,5 @@ public interface AdminJobClient { List fetchJobByAppName(String appName, Long namespace); List fetchJobByAppNameAndVersion(String appName, Integer version, Long namespace); - void registerJob(JobDefinition jobDefinition, String className); } diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/api/HttpDynamicTaskClientImpl.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/api/HttpDynamicTaskClientImpl.java new file mode 100644 index 0000000..05eae42 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/api/HttpDynamicTaskClientImpl.java @@ -0,0 +1,62 @@ +package com.xiang.core.schedule.api; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.TypeReference; +import com.xiang.core.quartz.model.XxzJobProperties; +import com.xiang.quartz.common.api.DynamicTaskApi; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; +import com.xiang.quartz.common.enums.url.DynamicTaskUrlEnum; +import com.xiang.xmc.service.http.helper.BaseHttpHelp; +import com.xiang.xmc.service.http.helper.HttpHelperFactory; +import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.basic.common.resp.ResultUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author: xiang + * @Date: 2026-02-11 10:04 + */ +@Service() +@RequiredArgsConstructor +public class HttpDynamicTaskClientImpl implements DynamicTaskApi { + private final XxzJobProperties xxzJobProperties; + private static final BaseHttpHelp httpHelp = HttpHelperFactory.createQuartzHttp(); + + @Override + public Result saveTask(DynamicTaskSaveRequest request) { + String baseUrl = xxzJobProperties.getAdminAddress(); + String resp = httpHelp.doPost(baseUrl + DynamicTaskUrlEnum.SAVE_TASK.getUrl(), null, JSON.toJSONString(request)); + return ResultUtils.getData(resp, new TypeReference>() { + }); + } + + @Override + public Result updateTask(DynamicTaskUpdateRequest request) { + String baseUrl = xxzJobProperties.getAdminAddress(); + String resp = httpHelp.doPost(baseUrl + DynamicTaskUrlEnum.UPDATE_TASK.getUrl(), null, JSON.toJSONString(request)); + return ResultUtils.getData(resp, new TypeReference>() { + }); + } + + @Override + public Result info(Long id) { + String baseUrl = xxzJobProperties.getAdminAddress(); + String resp = httpHelp.doGet(baseUrl + DynamicTaskUrlEnum.QUERY_TASK_INFO.getUrl() + id, null); + return ResultUtils.getData(resp, new TypeReference>() { + }); + } + + @Override + public Result> list(DynamicTaskQueryRequest request) { + String baseUrl = xxzJobProperties.getAdminAddress(); + String resp = httpHelp.doPost(baseUrl + DynamicTaskUrlEnum.QUERY_TASK_LIST.getUrl(), null, JSON.toJSONString(request)); + return ResultUtils.getData(resp, new TypeReference>>() { + }); + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicSchedulerAutoConfiguration.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicSchedulerAutoConfiguration.java new file mode 100644 index 0000000..ce9aada --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicSchedulerAutoConfiguration.java @@ -0,0 +1,12 @@ +package com.xiang.core.schedule.config; + +import com.xiang.core.schedule.core.DynamicTaskScheduler; +import com.xiang.core.schedule.core.TaskRegistry; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.context.annotation.Import; + +@AutoConfiguration +@Import({DynamicTaskSchedulerConfig.class, DynamicTaskScheduler.class, TaskRegistry.class}) +public class DynamicSchedulerAutoConfiguration { + +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicTaskSchedulerConfig.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicTaskSchedulerConfig.java new file mode 100644 index 0000000..25ad774 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/config/DynamicTaskSchedulerConfig.java @@ -0,0 +1,19 @@ +package com.xiang.core.schedule.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + +@Configuration +public class DynamicTaskSchedulerConfig { + @Bean + public ThreadPoolTaskScheduler globalTaskScheduler() { + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(10); + scheduler.setThreadNamePrefix("dynamic-task-"); + scheduler.setWaitForTasksToCompleteOnShutdown(true); + scheduler.setAwaitTerminationSeconds(30); + scheduler.initialize(); + return scheduler; + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/DynamicTaskScheduler.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/DynamicTaskScheduler.java new file mode 100644 index 0000000..b1689af --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/DynamicTaskScheduler.java @@ -0,0 +1,51 @@ +package com.xiang.core.schedule.core; + +import com.xiang.core.schedule.entity.TaskConfig; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ScheduledFuture; + +@Component +@RequiredArgsConstructor +public class DynamicTaskScheduler { + private final ThreadPoolTaskScheduler taskScheduler; + private final Map> taskMap = new ConcurrentHashMap<>(); + + + public void schedule(TaskConfig config, Runnable task) { + schedule(config, task, LocalDateTime.now()); + } + + public void schedule(TaskConfig config, Runnable task, LocalDateTime serverTime) { + LocalDateTime time = config.getExecutionTime(); + if (time.isBefore(serverTime)) return; + + ScheduledFuture future = taskScheduler.schedule(() -> { + try { + task.run(); + } finally { + taskMap.remove(config.getTaskId()); + } + }, Date.from(time.atZone(ZoneId.systemDefault()).toInstant())); + taskMap.put(config.getTaskId(), future); + } + + public void cancel(Long taskId) { + ScheduledFuture future = taskMap.get(taskId); + if (future != null) { + future.cancel(true); + taskMap.remove(taskId); + } + } + + public Boolean contains(Long taskId) { + return taskMap.containsKey(taskId); + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/TaskRegistry.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/TaskRegistry.java new file mode 100644 index 0000000..7558116 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/core/TaskRegistry.java @@ -0,0 +1,21 @@ +package com.xiang.core.schedule.core; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +public class TaskRegistry { + private final ConcurrentHashMap> handlers = new ConcurrentHashMap<>(); + + public void register(Long taskId, Consumer consumer) { + handlers.put(taskId, consumer); + } + + public void run(Long taskId) { + Consumer consumer = handlers.get(taskId); + if (consumer != null) consumer.accept(taskId); + } + + public void unregister(Long taskId) { + handlers.remove(taskId); + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/entity/TaskConfig.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/entity/TaskConfig.java new file mode 100644 index 0000000..c8876ae --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/entity/TaskConfig.java @@ -0,0 +1,19 @@ +package com.xiang.core.schedule.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.util.Map; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class TaskConfig { + private Long taskId; + private String taskName; + private String taskGroup; + private LocalDateTime executionTime; + private Map parameters; +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/enums/TaskGroupEnum.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/enums/TaskGroupEnum.java new file mode 100644 index 0000000..d69296a --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/enums/TaskGroupEnum.java @@ -0,0 +1,17 @@ +package com.xiang.core.schedule.enums; + +import lombok.Getter; + +@Getter +public enum TaskGroupEnum { + SERVICE_SAMPLE_SCHEDULE("sample", "测试动态定时任务"), + SERVICE_FWD_SCHEDULE("xs-fwd", "芬玩岛定时任务"); + + private final String code; + private final String desc; + + TaskGroupEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/helper/TaskExecutor.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/helper/TaskExecutor.java new file mode 100644 index 0000000..edb5cf9 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/helper/TaskExecutor.java @@ -0,0 +1,8 @@ +package com.xiang.core.schedule.helper; + + +import com.xiang.core.schedule.entity.TaskConfig; + +public interface TaskExecutor { + void execute(TaskConfig taskInfo); +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/DynamicTaskSchedulerServiceImpl.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/DynamicTaskSchedulerServiceImpl.java new file mode 100644 index 0000000..485cc19 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/DynamicTaskSchedulerServiceImpl.java @@ -0,0 +1,107 @@ +package com.xiang.core.schedule.service; + +import com.xiang.quartz.common.api.DynamicTaskApi; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; +import com.xiang.quartz.common.enums.TaskStatusEnum; +import com.xiang.xservice.basic.common.resp.Result; +import com.xiang.xservice.basic.common.resp.ResultUtils; +import com.xiang.xservice.basic.exception.BusinessException; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{ + + private final DynamicTaskApi dynamicTaskApi; + + @Override + public Boolean saveTask(DynamicTaskSaveRequest entity) { + Result result = dynamicTaskApi.saveTask(entity); + if (StringUtils.equals(Result.SUCCESS_CODE, result.getCode())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + public Boolean updateTask(DynamicTaskUpdateRequest entity) { + Result result = dynamicTaskApi.updateTask(entity); + if (StringUtils.equals(Result.SUCCESS_CODE, result.getCode())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + public DynamicTaskInfoResponse getTask(Long taskId) { + return ResultUtils.getData(dynamicTaskApi.info(taskId)); + } + + @Override + public Boolean updateProcess(Long taskId) { + DynamicTaskInfoResponse task = getTask(taskId); + if (Objects.isNull(task)) { + throw new BusinessException("task不存在!"); + } + DynamicTaskUpdateRequest dynamicTaskUpdateRequest = buildUpdateTaskRequest(task); + dynamicTaskUpdateRequest.setStatus(TaskStatusEnum.PROCEED.getCode()); + return updateTask(dynamicTaskUpdateRequest); + } + + @Override + public Boolean cancelTask(Long taskId) { + DynamicTaskInfoResponse task = getTask(taskId); + if (Objects.isNull(task)) { + throw new BusinessException("task不存在!"); + } + DynamicTaskUpdateRequest dynamicTaskUpdateRequest = buildUpdateTaskRequest(task); + dynamicTaskUpdateRequest.setStatus(TaskStatusEnum.CANCELED.getCode()); + return updateTask(dynamicTaskUpdateRequest); + } + + @Override + public Boolean finishTask(Long taskId) { + DynamicTaskInfoResponse task = getTask(taskId); + if (Objects.isNull(task)) { + throw new BusinessException("task不存在!"); + } + DynamicTaskUpdateRequest dynamicTaskUpdateRequest = buildUpdateTaskRequest(task); + dynamicTaskUpdateRequest.setStatus(TaskStatusEnum.FINISHED.getCode()); + return updateTask(dynamicTaskUpdateRequest); + } + + @Override + public Boolean errTask(Long taskId) { + DynamicTaskInfoResponse task = getTask(taskId); + if (Objects.isNull(task)) { + throw new BusinessException("task不存在!"); + } + DynamicTaskUpdateRequest dynamicTaskUpdateRequest = buildUpdateTaskRequest(task); + dynamicTaskUpdateRequest.setStatus(TaskStatusEnum.ERROR.getCode()); + return updateTask(dynamicTaskUpdateRequest); + } + + @Override + public List getTaskList(DynamicTaskQueryRequest entity) { + return ResultUtils.getData(dynamicTaskApi.list(entity)); + } + + private DynamicTaskUpdateRequest buildUpdateTaskRequest(DynamicTaskInfoResponse response) { + DynamicTaskUpdateRequest dynamicTaskUpdateRequest = new DynamicTaskUpdateRequest(); + dynamicTaskUpdateRequest.setId(response.getId()); + dynamicTaskUpdateRequest.setTaskName(response.getTaskName()); + dynamicTaskUpdateRequest.setTaskGroup(response.getTaskGroup()); + dynamicTaskUpdateRequest.setRunTime(response.getRunTime()); + dynamicTaskUpdateRequest.setStatus(response.getStatus()); + dynamicTaskUpdateRequest.setParameters(response.getParameters()); + return dynamicTaskUpdateRequest; + } +} diff --git a/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/IDynamicTaskSchedulerService.java b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/IDynamicTaskSchedulerService.java new file mode 100644 index 0000000..cb94a79 --- /dev/null +++ b/xservice-quartz-core/src/main/java/com/xiang/core/schedule/service/IDynamicTaskSchedulerService.java @@ -0,0 +1,21 @@ +package com.xiang.core.schedule.service; + + +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskQueryRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskUpdateRequest; +import com.xiang.quartz.common.entity.dynamic.response.DynamicTaskInfoResponse; + +import java.util.List; + + +public interface IDynamicTaskSchedulerService { + Boolean saveTask(DynamicTaskSaveRequest entity); + Boolean updateTask(DynamicTaskUpdateRequest entity); + DynamicTaskInfoResponse getTask(Long taskId); + Boolean updateProcess(Long taskId); + Boolean cancelTask(Long taskId); + Boolean finishTask(Long taskId); + Boolean errTask(Long taskId); + List getTaskList(DynamicTaskQueryRequest entity); +} diff --git a/xservice-quartz-core/src/main/resources/META-INF/spring.factories b/xservice-quartz-core/src/main/resources/META-INF/spring.factories index e587c63..5d04f15 100644 --- a/xservice-quartz-core/src/main/resources/META-INF/spring.factories +++ b/xservice-quartz-core/src/main/resources/META-INF/spring.factories @@ -1,2 +1,3 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -com.xiang.core.quartz.config.XxzJobAutoConfiguration \ No newline at end of file +com.xiang.core.quartz.config.XxzJobAutoConfiguration, \ +com.xiang.core.schedule.config.DynamicSchedulerAutoConfiguration \ No newline at end of file diff --git a/xservice-quartz-sample/pom.xml b/xservice-quartz-sample/pom.xml index 5234441..24722b5 100644 --- a/xservice-quartz-sample/pom.xml +++ b/xservice-quartz-sample/pom.xml @@ -22,7 +22,7 @@ com.xiang.starter xservice-quartz-core - 1.1 + 1.2 diff --git a/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/server/TestController.java b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/server/TestController.java new file mode 100644 index 0000000..152dbc4 --- /dev/null +++ b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/server/TestController.java @@ -0,0 +1,23 @@ +package com.xiang.app.dynamic.task.sample.springboot.server; + +import com.xiang.app.dynamic.task.sample.springboot.task.TestTaskService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: xiang + * @Date: 2026-02-11 14:12 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/sample/dynamic/task") +public class TestController { + private final TestTaskService testTaskService; + + @GetMapping("/test") + public void test() { + testTaskService.test(); + } +} diff --git a/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTask.java b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTask.java new file mode 100644 index 0000000..21927da --- /dev/null +++ b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTask.java @@ -0,0 +1,31 @@ +package com.xiang.app.dynamic.task.sample.springboot.task; + +import com.xiang.core.schedule.service.IDynamicTaskSchedulerService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * @Author: xiang + * @Date: 2026-02-11 14:11 + */ +@Slf4j +@RequiredArgsConstructor +public class TestTask implements Runnable { + + private final IDynamicTaskSchedulerService dynamicTaskSchedulerService; + private final Long taskId; + + @Override + public void run() { + dynamicTaskSchedulerService.updateProcess(taskId); + log.info("动态任务开始运行!!!"); + try { + log.info("模拟任务处理 10秒钟"); + Thread.sleep(10000); + } catch (InterruptedException e) { + log.error("处理失败"); + } + log.info("任务处理完成!"); + dynamicTaskSchedulerService.finishTask(taskId); + } +} diff --git a/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTaskService.java b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTaskService.java new file mode 100644 index 0000000..411bd4a --- /dev/null +++ b/xservice-quartz-sample/src/main/java/com/xiang/app/dynamic/task/sample/springboot/task/TestTaskService.java @@ -0,0 +1,38 @@ +package com.xiang.app.dynamic.task.sample.springboot.task; + +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Maps; +import com.xiang.core.schedule.core.DynamicTaskScheduler; +import com.xiang.core.schedule.entity.TaskConfig; +import com.xiang.core.schedule.enums.TaskGroupEnum; +import com.xiang.core.schedule.service.IDynamicTaskSchedulerService; +import com.xiang.quartz.common.entity.dynamic.request.DynamicTaskSaveRequest; +import com.xiang.quartz.common.enums.TaskStatusEnum; +import com.xiang.xservice.basic.utils.PrimaryKeyUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * @Author: xiang + * @Date: 2026-02-11 14:06 + */ +@Component +@RequiredArgsConstructor +public class TestTaskService { + private final DynamicTaskScheduler dynamicTaskScheduler; + private final IDynamicTaskSchedulerService dynamicTaskSchedulerService; + + public void test() { + long taskId = PrimaryKeyUtils.snowflakeId(); + Map params = Maps.newHashMap(); + LocalDateTime runTime = LocalDateTime.of(2026, 2, 11, 15, 23, 00); + dynamicTaskSchedulerService.saveTask(new DynamicTaskSaveRequest(taskId, "测试动态任务运行", TaskGroupEnum.SERVICE_SAMPLE_SCHEDULE.getDesc(), runTime, TaskStatusEnum.UN_START.getCode(), JSON.toJSONString(params))); + dynamicTaskScheduler.schedule( + new TaskConfig(taskId, "测试动态任务运行", TaskGroupEnum.SERVICE_SAMPLE_SCHEDULE.getCode(), runTime, params), + new TestTask(dynamicTaskSchedulerService, taskId) + ); + } +}