perf:动态调度数据库保存
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package com.xiang.xservice.schedule.config;
|
package com.xiang.xservice.schedule.config;
|
||||||
|
|
||||||
|
import com.xiang.xservice.schedule.core.TaskRegistry;
|
||||||
import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService;
|
import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService;
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
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.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.xiang.xservice.schedule;
|
package com.xiang.xservice.schedule.enums;
|
||||||
|
|
||||||
import lombok.Getter;
|
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;
|
package com.xiang.xservice.schedule.service;
|
||||||
|
|
||||||
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
|
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
|
||||||
import com.xiang.xservice.schedule.entity.TaskConfig;
|
|
||||||
import com.xiang.xservice.schedule.mapper.ScheduledTaskMapper;
|
import com.xiang.xservice.schedule.mapper.ScheduledTaskMapper;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
|
||||||
import org.springframework.stereotype.Service;
|
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
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{
|
public class DynamicTaskSchedulerServiceImpl implements IDynamicTaskSchedulerService{
|
||||||
|
|
||||||
private final ThreadPoolTaskScheduler taskScheduler;
|
|
||||||
private final ScheduledTaskMapper scheduledTaskMapper;
|
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
|
@Override
|
||||||
public Boolean saveTask(ScheduledTaskEntity entity) {
|
public Boolean saveTask(ScheduledTaskEntity entity) {
|
||||||
return scheduledTaskMapper.save(entity) > 0;
|
return scheduledTaskMapper.save(entity) > 0;
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
package com.xiang.xservice.schedule.service;
|
package com.xiang.xservice.schedule.service;
|
||||||
|
|
||||||
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
|
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
|
||||||
import com.xiang.xservice.schedule.entity.TaskConfig;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
|
|
||||||
public interface IDynamicTaskSchedulerService {
|
public interface IDynamicTaskSchedulerService {
|
||||||
void schedule(TaskConfig config, Runnable task);
|
|
||||||
void cancel(String taskId);
|
|
||||||
Boolean contains(String taskId);
|
|
||||||
Boolean saveTask(ScheduledTaskEntity entity);
|
Boolean saveTask(ScheduledTaskEntity entity);
|
||||||
Boolean updateTask(ScheduledTaskEntity entity);
|
Boolean updateTask(ScheduledTaskEntity entity);
|
||||||
ScheduledTaskEntity getTask(String taskId);
|
ScheduledTaskEntity getTask(String taskId);
|
||||||
|
|||||||
Reference in New Issue
Block a user