场景需求:在执行某个方法的两小时之后进行某个操作
涉及:定时任务、哈希表
需要注意:文章来源:https://www.toymoban.com/news/detail-821402.html
- 业务逻辑层是单一实例的,所以在定时任务类内操作业务逻辑层的某个属性和在业务逻辑层内操作的都是同一个。
- 使用Map存放数据不要用IdentityHashMap,因为IdentityHashMap比较key值用的是“==”,也就是直接比较地址,所以用taskId作为key值取不出来。
疑问:ThreadPoolTaskScheduler线程池需不需要规定线程数量?文章来源地址https://www.toymoban.com/news/detail-821402.html
定时任务类
@Component
public class VideoRecorderScheduler {
private final TestService testService = SpringContextHolder.getBean(TestService.class);
public VideoRecorderScheduler(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
// 开启定时任务
public ScheduledFuture startVideoRecording(){
//System.out.println("开始啦--------------------");
// 记录开启时间
startTime = System.currentTimeMillis();
//开启任务 两小时后自动执行停止任务 可以改成两分钟方便测试
stopTask = taskScheduler.schedule(this::stopVideoRecording, Instant.now().plusSeconds(2 * 60 * 60));
return stopTask;
}
// 停止定时任务
private void stopVideoRecording(){
// 执行其他操作
// ...
// 关闭定时任务
if (stopTask != null && !stopTask.isCancelled()) {
stopTask.cancel(true);
testService.getScheduledTasks().remove(taskId);
}
}
}
测试类 testService
@Service
public class TestService(){
// 存放定时任务的map
@Getter
private ConcurrentHashMap<String,ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
// 用IdentityHashMap取不出来数据,取出的是null
// 因为IdentityHashMap,比较key值,直接使用的是==,也就是比较地址
// private Map<String, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
public void start(){
//开启定时任务
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); // 创建一个ThreadPoolTaskScheduler对象
taskScheduler.initialize(); // 初始化taskScheduler
VideoRecorderScheduler videoRecorder = new VideoRecorderScheduler(taskScheduler); // 创建一个带参数的VideoRecorder对象
//放入map
ScheduledFuture stopTask = videoRecorder.startVideoRecording();
scheduledTasks.put(taskId,stopTask);
}
public void stop(){
//取消定时任务
ScheduledFuture<?> stopTask = scheduledTasks.get(taskId);
scheduledTasks.remove(taskId);
if (stopTask != null && !stopTask.isCancelled()) {
stopTask.cancel(true);
}
}
}
到了这里,关于SpringBoot开启动态定时任务并手动、自动关闭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!