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)
+ );
+ }
+}