perf:动态调度数据库保存
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.xiang.xservice.schedule;
|
||||
package com.xiang.xservice.schedule.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.xiang.xservice.schedule.helper;
|
||||
|
||||
|
||||
import com.xiang.xservice.schedule.entity.TaskConfig;
|
||||
|
||||
public interface TaskExecutor {
|
||||
void execute(TaskConfig taskInfo);
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user