perf:动态调度数据库保存

This commit is contained in:
xiang
2025-07-27 16:50:36 +08:00
parent 0388d84463
commit 6e0154bfe9
7 changed files with 60 additions and 50 deletions

View File

@@ -1,5 +1,6 @@
package com.xiang.xservice.schedule.config;
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;

View File

@@ -0,0 +1,49 @@
package com.xiang.xservice.schedule.core;
import com.xiang.xservice.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<Long, ScheduledFuture<?>> taskMap = new ConcurrentHashMap<>();
public void schedule(TaskConfig config, Runnable task) {
LocalDateTime time = config.getExecutionTime();
if (time.isBefore(LocalDateTime.now())) 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);
}
}

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.schedule.config;
package com.xiang.xservice.schedule.core;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

View File

@@ -1,4 +1,4 @@
package com.xiang.xservice.schedule;
package com.xiang.xservice.schedule.enums;
import lombok.Getter;

View File

@@ -0,0 +1,8 @@
package com.xiang.xservice.schedule.helper;
import com.xiang.xservice.schedule.entity.TaskConfig;
public interface TaskExecutor {
void execute(TaskConfig taskInfo);
}

View File

@@ -1,59 +1,16 @@
package com.xiang.xservice.schedule.service;
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
import com.xiang.xservice.schedule.entity.TaskConfig;
import com.xiang.xservice.schedule.mapper.ScheduledTaskMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Service;
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;
@Service
@RequiredArgsConstructor
public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{
private final ThreadPoolTaskScheduler taskScheduler;
private final ScheduledTaskMapper scheduledTaskMapper;
private final Map<Long, ScheduledFuture<?>> taskMap = new ConcurrentHashMap<>();
@Override
public void schedule(TaskConfig config, Runnable task) {
LocalDateTime time = config.getExecutionTime();
if (time.isBefore(LocalDateTime.now())) 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);
}
@Override
public void cancel(String taskId) {
ScheduledFuture<?> future = taskMap.get(taskId);
if (future != null) {
future.cancel(true);
taskMap.remove(taskId);
}
}
@Override
public Boolean contains(String taskId) {
return taskMap.containsKey(taskId);
}
@Override
public Boolean saveTask(ScheduledTaskEntity entity) {
return scheduledTaskMapper.save(entity) > 0;

View File

@@ -1,14 +1,9 @@
package com.xiang.xservice.schedule.service;
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
import com.xiang.xservice.schedule.entity.TaskConfig;
import java.time.LocalDateTime;
public interface IDynamicTaskSchedulerService {
void schedule(TaskConfig config, Runnable task);
void cancel(String taskId);
Boolean contains(String taskId);
Boolean saveTask(ScheduledTaskEntity entity);
Boolean updateTask(ScheduledTaskEntity entity);
ScheduledTaskEntity getTask(String taskId);