python
from apscheduler.schedulers.background import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger
import time
from apscheduler.triggers.interval import IntervalTrigger
from config.config_util import get_yaml_cfg_by_key
from tools import db_util
from tools.logger_util import logger
from tools.request_util import trigger_batch
db_cfg = get_yaml_cfg_by_key("check_db")
class TaskScheduler:
def __init__(self):
self.scheduler = BlockingScheduler()
self.job = None
def get_scheduler_cfg(self, config_id):
sql = f"select config_value from cmap_qc_config where config_id = '{config_id}' "
one = db_util.fetch_pg(db_cfg, sql, fetchall=False)
cron_expression, is_enabled = one[0]['cron_expression'], one[0]['enabled']
return cron_expression, bool(is_enabled)
def start_or_update_task(self, config_id):
cron_expression, enabled = self.get_scheduler_cfg(config_id)
if enabled:
cron_trigger = CronTrigger.from_crontab(cron_expression)
if self.job:
if self.job.trigger.fields != cron_trigger.fields:
self.job.remove()
self.job = self.scheduler.add_job(self.pdb_check, trigger=cron_trigger)
logger.info(f"任务已更新,新的 cron 表达式为:{cron_expression}")
else:
logger.info(f"不需要更新,新的 cron 表达式为:{cron_expression}")
else:
self.job = self.scheduler.add_job(self.pdb_check, trigger=cron_trigger)
logger.info(f"任务已启动,cron 表达式为:{cron_expression}")
logger.info(f"{self.job.next_run_time=}")
else:
if self.job:
self.job.remove()
self.job = None
logger.info("任务已停止。")
else:
logger.info("任务未启动,数据库配置为禁用。")
def pdb_check(self):
logger.info(f"任务正在执行,当前时间:{time.strftime('%Y-%m-%d %H:%M:%S')}")
trigger_batch_res = trigger_batch()
logger.info(f"{trigger_batch_res=}")
def shutdown(self):
self.scheduler.shutdown(wait=False)
logger.info("调度器已关闭。")
def start_scheduler():
task_scheduler = TaskScheduler()
# task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
# trigger=CronTrigger(second="*/5"))
# task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
# trigger=IntervalTrigger(minutes=1))
task_scheduler.scheduler.add_job(task_scheduler.start_or_update_task, args=["pdb_check_scheduler"],
trigger=IntervalTrigger(minutes=30))
logger.info("starting....")
task_scheduler.scheduler.start()
# try:
# # print("调度器已启动,按 Ctrl+C 退出。")
# while True:
# time.sleep(10)
# except KeyboardInterrupt:
# task_scheduler.shutdown()
# 测试代码
if __name__ == "__main__":
start_scheduler()