diff --git a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/config/ExecutorConfiguration.java b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/config/ExecutorConfiguration.java new file mode 100644 index 0000000000..29c52cc396 --- /dev/null +++ b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/config/ExecutorConfiguration.java @@ -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<>() + ); + } + +} diff --git a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/runner/LoadCronJobRunner.java b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/runner/LoadCronJobRunner.java new file mode 100644 index 0000000000..615fe5798a --- /dev/null +++ b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/runner/LoadCronJobRunner.java @@ -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(); + }); + } +} diff --git a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobLoadingServiceImpl.java b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobLoadingServiceImpl.java index 7669ed3c3b..373f448616 100644 --- a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobLoadingServiceImpl.java +++ b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobLoadingServiceImpl.java @@ -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"); @@ -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); } } diff --git a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobServiceImpl.java b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobServiceImpl.java index f2a302b02c..4cf29eaecf 100644 --- a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobServiceImpl.java +++ b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/service/impl/CronJobServiceImpl.java @@ -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); } diff --git a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/task/ScheduledTasks.java b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/task/ScheduledTasks.java index 7d3442389f..1abe489890 100644 --- a/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/task/ScheduledTasks.java +++ b/src/backend/job-crontab/service-job-crontab/src/main/java/com/tencent/bk/job/crontab/task/ScheduledTasks.java @@ -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(); } }