Skip to content

Commit

Permalink
Merge pull request #2935 from jsonwan/github_fix/cron
Browse files Browse the repository at this point in the history
fix: 定时任务服务更新后偶现任务不触发 #2926
  • Loading branch information
wangyu096 authored Apr 26, 2024
2 parents 6dec649 + ef2f023 commit a82f2ee
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Tencent is pleased to support the open source community by making BK-JOB蓝鲸智云作业平台 available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* BK-JOB蓝鲸智云作业平台 is licensed under the MIT License.
*
* License for BK-JOB蓝鲸智云作业平台:
* --------------------------------------------------------------------
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/

package com.tencent.bk.job.crontab.config;

import com.tencent.bk.job.common.WatchableThreadPoolExecutor;
import io.micrometer.core.instrument.MeterRegistry;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Slf4j
@Configuration(value = "jobCrontabExecutorConfig")
public class ExecutorConfiguration {

@Bean("crontabInitRunnerExecutor")
public ThreadPoolExecutor crontabInitRunnerExecutor(MeterRegistry meterRegistry) {
return new WatchableThreadPoolExecutor(
meterRegistry,
"initRunnerExecutor",
0,
5,
1,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>()
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Tencent is pleased to support the open source community by making BK-JOB蓝鲸智云作业平台 available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* BK-JOB蓝鲸智云作业平台 is licensed under the MIT License.
*
* License for BK-JOB蓝鲸智云作业平台:
* --------------------------------------------------------------------
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
* to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
* THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/

package com.tencent.bk.job.crontab.runner;

import com.tencent.bk.job.crontab.service.CronJobLoadingService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.concurrent.ThreadPoolExecutor;

/**
* 进程启动时立即将DB中的定时任务加载到Quartz
*/
@Slf4j
@Component
public class LoadCronJobRunner implements CommandLineRunner {

private final CronJobLoadingService cronJobLoadingService;
private final ThreadPoolExecutor crontabInitRunnerExecutor;

@Autowired
public LoadCronJobRunner(CronJobLoadingService cronJobLoadingService,
@Qualifier("crontabInitRunnerExecutor") ThreadPoolExecutor crontabInitRunnerExecutor) {
this.cronJobLoadingService = cronJobLoadingService;
this.crontabInitRunnerExecutor = crontabInitRunnerExecutor;
}

@Override
public void run(String... args) {
crontabInitRunnerExecutor.submit(() -> {
log.info("loadCronToQuartzOnStartup");
cronJobLoadingService.loadAllCronJob();
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public CronJobLoadingServiceImpl(CronJobBatchLoadService cronJobBatchLoadService

@Override
public void loadAllCronJob() {
long start = System.currentTimeMillis();
try {
if (loadingCronToQuartz) {
log.info("Last loading not finish, ignore");
Expand All @@ -60,6 +61,7 @@ public void loadAllCronJob() {
log.warn("Fail to loadAllCronJob", e);
} finally {
loadingCronToQuartz = false;
log.info("loadAllCronJob end, duration={}ms", System.currentTimeMillis() - start);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -850,11 +850,11 @@ public boolean addJobToQuartz(long appId, long cronJobId) throws ServiceExceptio
}
return true;
} catch (ServiceException e) {
informAllToDeleteJobFromQuartz(appId, cronJobId);
deleteJobFromQuartz(appId, cronJobId);
log.debug("Error while schedule job", e);
throw e;
} catch (Exception e) {
informAllToDeleteJobFromQuartz(appId, cronJobId);
deleteJobFromQuartz(appId, cronJobId);
log.error("Unknown exception while process cron status change!", e);
throw new InternalException(ErrorCode.UPDATE_CRON_JOB_FAILED);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,11 @@ public ScheduledTasks(CronJobLoadingService cronJobLoadingService) {
}

/**
* 每间隔30min更新一次定时任务数据到Quartz内存
* 每天早上9:30更新一次定时任务数据到Quartz内存
*/
@Scheduled(initialDelay = 5 * 1000, fixedDelay = 30 * 60 * 1000)
public void loadCronToQuartz() {
log.info("loadCronToQuartz");
long start = System.currentTimeMillis();
try {
cronJobLoadingService.loadAllCronJob();
} catch (Exception e) {
log.error("loadCronToQuartz fail", e);
} finally {
log.info("loadCronToQuartz end, duration={}ms", System.currentTimeMillis() - start);
}
@Scheduled(cron = "0 30 9 * * *")
public void loadCronToQuartzPeriodically() {
log.info("loadCronToQuartzPeriodically");
cronJobLoadingService.loadAllCronJob();
}
}

0 comments on commit a82f2ee

Please sign in to comment.