場(chǎng)景需求:在執(zhí)行某個(gè)方法的兩小時(shí)之后進(jìn)行某個(gè)操作
涉及:定時(shí)任務(wù)、哈希表
需要注意:文章來源:http://www.zghlxwxcb.cn/news/detail-821402.html
- 業(yè)務(wù)邏輯層是單一實(shí)例的,所以在定時(shí)任務(wù)類內(nèi)操作業(yè)務(wù)邏輯層的某個(gè)屬性和在業(yè)務(wù)邏輯層內(nèi)操作的都是同一個(gè)。
- 使用Map存放數(shù)據(jù)不要用IdentityHashMap,因?yàn)镮dentityHashMap比較key值用的是“==”,也就是直接比較地址,所以用taskId作為key值取不出來。
疑問:ThreadPoolTaskScheduler線程池需不需要規(guī)定線程數(shù)量?文章來源地址http://www.zghlxwxcb.cn/news/detail-821402.html
定時(shí)任務(wù)類
@Component
public class VideoRecorderScheduler {
private final TestService testService = SpringContextHolder.getBean(TestService.class);
public VideoRecorderScheduler(TaskScheduler taskScheduler) {
this.taskScheduler = taskScheduler;
}
// 開啟定時(shí)任務(wù)
public ScheduledFuture startVideoRecording(){
//System.out.println("開始啦--------------------");
// 記錄開啟時(shí)間
startTime = System.currentTimeMillis();
//開啟任務(wù) 兩小時(shí)后自動(dòng)執(zhí)行停止任務(wù) 可以改成兩分鐘方便測(cè)試
stopTask = taskScheduler.schedule(this::stopVideoRecording, Instant.now().plusSeconds(2 * 60 * 60));
return stopTask;
}
// 停止定時(shí)任務(wù)
private void stopVideoRecording(){
// 執(zhí)行其他操作
// ...
// 關(guān)閉定時(shí)任務(wù)
if (stopTask != null && !stopTask.isCancelled()) {
stopTask.cancel(true);
testService.getScheduledTasks().remove(taskId);
}
}
}
測(cè)試類 testService
@Service
public class TestService(){
// 存放定時(shí)任務(wù)的map
@Getter
private ConcurrentHashMap<String,ScheduledFuture<?>> scheduledTasks = new ConcurrentHashMap<>();
// 用IdentityHashMap取不出來數(shù)據(jù),取出的是null
// 因?yàn)镮dentityHashMap,比較key值,直接使用的是==,也就是比較地址
// private Map<String, ScheduledFuture<?>> scheduledTasks = new IdentityHashMap<>();
public void start(){
//開啟定時(shí)任務(wù)
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); // 創(chuàng)建一個(gè)ThreadPoolTaskScheduler對(duì)象
taskScheduler.initialize(); // 初始化taskScheduler
VideoRecorderScheduler videoRecorder = new VideoRecorderScheduler(taskScheduler); // 創(chuàng)建一個(gè)帶參數(shù)的VideoRecorder對(duì)象
//放入map
ScheduledFuture stopTask = videoRecorder.startVideoRecording();
scheduledTasks.put(taskId,stopTask);
}
public void stop(){
//取消定時(shí)任務(wù)
ScheduledFuture<?> stopTask = scheduledTasks.get(taskId);
scheduledTasks.remove(taskId);
if (stopTask != null && !stopTask.isCancelled()) {
stopTask.cancel(true);
}
}
}
到了這里,關(guān)于SpringBoot開啟動(dòng)態(tài)定時(shí)任務(wù)并手動(dòng)、自動(dòng)關(guān)閉的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!