From 4787e035354826429eef506457f1d6b430c988c1 Mon Sep 17 00:00:00 2001 From: xiang Date: Sun, 27 Jul 2025 23:46:31 +0800 Subject: [PATCH] =?UTF-8?q?perf:=E5=8A=A8=E6=80=81=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xservice-common/pom.xml | 1 + .../xservice/basic/utils/PrimaryKeyUtils.java | 65 +++++++++++++++++++ xservice-schedule-starter/pom.xml | 8 +++ .../DynamicSchedulerAutoConfiguration.java | 4 +- .../schedule/core/DynamicTaskScheduler.java | 3 +- .../xservice/schedule/entity/TaskConfig.java | 3 + .../schedule/enums/TaskStatusEnum.java | 20 ++++++ .../schedule/mapper/ScheduledTaskMapper.java | 2 +- .../DynamicTaskSchedulerServiceImpl.java | 39 ++++++++++- .../service/IDynamicTaskSchedulerService.java | 5 +- .../resources/mapper/ScheduledTaskMapper.xml | 10 +-- 11 files changed, 148 insertions(+), 12 deletions(-) create mode 100644 xservice-common/src/main/java/com/xiang/xservice/basic/utils/PrimaryKeyUtils.java create mode 100644 xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskStatusEnum.java diff --git a/xservice-common/pom.xml b/xservice-common/pom.xml index 10f07ac..d57d05f 100644 --- a/xservice-common/pom.xml +++ b/xservice-common/pom.xml @@ -8,6 +8,7 @@ xservice-basic 1.0-SNAPSHOT + 1.0.2-SNAPSHOT xservice-common diff --git a/xservice-common/src/main/java/com/xiang/xservice/basic/utils/PrimaryKeyUtils.java b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/PrimaryKeyUtils.java new file mode 100644 index 0000000..d98e4f7 --- /dev/null +++ b/xservice-common/src/main/java/com/xiang/xservice/basic/utils/PrimaryKeyUtils.java @@ -0,0 +1,65 @@ +package com.xiang.xservice.basic.utils; + + +public class PrimaryKeyUtils { + /** + * 自定义起始时间戳,例如 2025-01-01 + */ + private static final long START_TIMESTAMP = 1735660800000L; + private static final long DATA_CENTER_ID_BITS = 5L; + private static final long WORKER_ID_BITS = 5L; + private static final long SEQUENCE_BITS = 12L; + + private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS); + private static final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS); + + private static final long WORKER_ID_SHIFT = SEQUENCE_BITS; + private static final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; + private static final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS; + + private static final long SEQUENCE_MASK = ~(-1L << SEQUENCE_BITS); + + // 可通过配置设置 + private static final long DATA_CENTER_ID = 1L; + private static final long WORKER_ID = 1L; + + private static long sequence = 0L; + private static long lastTimestamp = -1L; + + // 分布式下可使用分布式锁替代 synchronized + public static synchronized long snowflakeId() { + long timestamp = currentTimestamp(); + + if (timestamp < lastTimestamp) { + throw new RuntimeException("Clock moved backwards. Refusing to generate id"); + } + + if (timestamp == lastTimestamp) { + sequence = (sequence + 1) & SEQUENCE_MASK; + if (sequence == 0) { + timestamp = waitNextMillis(timestamp); + } + } else { + sequence = 0L; + } + + lastTimestamp = timestamp; + + return ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) + | (DATA_CENTER_ID << DATA_CENTER_ID_SHIFT) + | (WORKER_ID << WORKER_ID_SHIFT) + | sequence; + } + + private static long waitNextMillis(long currentTimestamp) { + long timestamp = currentTimestamp(); + while (timestamp <= currentTimestamp) { + timestamp = currentTimestamp(); + } + return timestamp; + } + + private static long currentTimestamp() { + return System.currentTimeMillis(); + } +} diff --git a/xservice-schedule-starter/pom.xml b/xservice-schedule-starter/pom.xml index fe12def..21ec7b3 100644 --- a/xservice-schedule-starter/pom.xml +++ b/xservice-schedule-starter/pom.xml @@ -18,4 +18,12 @@ UTF-8 + + + com.xiang + xservice-common + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java index 7e53339..769249a 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/config/DynamicSchedulerAutoConfiguration.java @@ -1,14 +1,14 @@ package com.xiang.xservice.schedule.config; +import com.xiang.xservice.schedule.core.DynamicTaskScheduler; import com.xiang.xservice.schedule.core.TaskRegistry; -import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Import; @AutoConfiguration @MapperScan("com.xiang.xservice.schedule.mapper") -@Import({DynamicTaskSchedulerConfig.class, IDynamicTaskSchedulerService.class, TaskRegistry.class}) +@Import({DynamicTaskSchedulerConfig.class, DynamicTaskScheduler.class, TaskRegistry.class}) public class DynamicSchedulerAutoConfiguration { } diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java index d6951a8..a5f7913 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/core/DynamicTaskScheduler.java @@ -5,6 +5,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; @@ -30,7 +31,6 @@ public class DynamicTaskScheduler { taskMap.remove(config.getTaskId()); } }, Date.from(time.atZone(ZoneId.systemDefault()).toInstant())); - taskMap.put(config.getTaskId(), future); } @@ -38,7 +38,6 @@ public class DynamicTaskScheduler { ScheduledFuture future = taskMap.get(taskId); if (future != null) { future.cancel(true); - taskMap.remove(taskId); } } diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java index 65ba390..4097387 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/entity/TaskConfig.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.Map; @Data @AllArgsConstructor @@ -12,5 +13,7 @@ import java.time.LocalDateTime; public class TaskConfig { private Long taskId; private String taskName; + private String taskGroup; private LocalDateTime executionTime; + private Map parameters; } diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskStatusEnum.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskStatusEnum.java new file mode 100644 index 0000000..cd266b3 --- /dev/null +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/enums/TaskStatusEnum.java @@ -0,0 +1,20 @@ +package com.xiang.xservice.schedule.enums; + +import lombok.Getter; + +@Getter +public enum TaskStatusEnum { + UN_START(1, "未开始"), + PROCEED(2, "进行中"), + FINISHED(3, "已完成"), + CANCELED(4, "取消") + ; + + private final Integer code; + private final String desc; + + TaskStatusEnum(Integer code, String desc) { + this.code = code; + this.desc = desc; + } +} diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/mapper/ScheduledTaskMapper.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/mapper/ScheduledTaskMapper.java index 08806f6..302046c 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/mapper/ScheduledTaskMapper.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/mapper/ScheduledTaskMapper.java @@ -13,5 +13,5 @@ public interface ScheduledTaskMapper { int update(ScheduledTaskEntity entity); - ScheduledTaskEntity getTask(@Param("id") String taskId); + ScheduledTaskEntity getTask(@Param("id") Long taskId); } diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java index 6f607a8..69e7178 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/DynamicTaskSchedulerServiceImpl.java @@ -1,10 +1,14 @@ package com.xiang.xservice.schedule.service; import com.xiang.xservice.schedule.entity.ScheduledTaskEntity; +import com.xiang.xservice.schedule.enums.TaskStatusEnum; import com.xiang.xservice.schedule.mapper.ScheduledTaskMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.Objects; + @Service @RequiredArgsConstructor public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{ @@ -22,7 +26,40 @@ public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerSer } @Override - public ScheduledTaskEntity getTask(String taskId) { + public ScheduledTaskEntity getTask(Long taskId) { return scheduledTaskMapper.getTask(taskId); } + + @Override + public Boolean updateProcess(Long taskId) { + ScheduledTaskEntity task = scheduledTaskMapper.getTask(taskId); + if (Objects.nonNull(task)) { + task.setStatus(TaskStatusEnum.PROCEED.getCode()); + task.setUpdatedTime(LocalDateTime.now()); + return scheduledTaskMapper.update(task) > 0; + } + return Boolean.FALSE; + } + + @Override + public Boolean cancelTask(Long taskId) { + ScheduledTaskEntity task = scheduledTaskMapper.getTask(taskId); + if (Objects.nonNull(task)) { + task.setStatus(TaskStatusEnum.CANCELED.getCode()); + task.setUpdatedTime(LocalDateTime.now()); + return scheduledTaskMapper.update(task) > 0; + } + return Boolean.FALSE; + } + + @Override + public Boolean finishTask(Long taskId) { + ScheduledTaskEntity task = scheduledTaskMapper.getTask(taskId); + if (Objects.nonNull(task)) { + task.setStatus(TaskStatusEnum.FINISHED.getCode()); + task.setUpdatedTime(LocalDateTime.now()); + return scheduledTaskMapper.update(task) > 0; + } + return Boolean.FALSE; + } } diff --git a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java index 1168dfd..c2a91da 100644 --- a/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java +++ b/xservice-schedule-starter/src/main/java/com/xiang/xservice/schedule/service/IDynamicTaskSchedulerService.java @@ -6,5 +6,8 @@ import com.xiang.xservice.schedule.entity.ScheduledTaskEntity; public interface IDynamicTaskSchedulerService { Boolean saveTask(ScheduledTaskEntity entity); Boolean updateTask(ScheduledTaskEntity entity); - ScheduledTaskEntity getTask(String taskId); + ScheduledTaskEntity getTask(Long taskId); + Boolean updateProcess(Long taskId); + Boolean cancelTask(Long taskId); + Boolean finishTask(Long taskId); } diff --git a/xservice-schedule-starter/src/main/resources/mapper/ScheduledTaskMapper.xml b/xservice-schedule-starter/src/main/resources/mapper/ScheduledTaskMapper.xml index bdb8df8..f3db068 100644 --- a/xservice-schedule-starter/src/main/resources/mapper/ScheduledTaskMapper.xml +++ b/xservice-schedule-starter/src/main/resources/mapper/ScheduledTaskMapper.xml @@ -19,13 +19,13 @@ - - INSERT INTO script_schedule_task (task_name, task_group, run_time, status, parameters, create_time, update_time) - VALUES (#{taskName}, #{taskGroup}, #{runTime}, #{status}, #{parameters}, #{createdTime}, #{updatedTime}) + + 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}, @@ -37,7 +37,7 @@ WHERE id = #{id} - select from script_schedule_task where id = #{id}