import datetime import signal import sys import time from typing import Optional import schedule import utils from jobs.job_runner import JobRunner class Application: """应用程序主类""" def __init__(self): """初始化应用程序""" self._init_logger() self._init_config() self._init_signal_handlers() def _init_logger(self): """初始化日志系统""" self.logger = utils.get_logger() self.logger.info("日志系统初始化完成") def _init_config(self): """初始化配置""" self.running = True self.job: Optional[JobRunner] = None self.interval = utils.get_config_int("job.sleep_interval", 10) self.logger.info(f"配置加载完成, 任务检查间隔: {self.interval}秒") def _init_signal_handlers(self): """初始化信号处理器""" signal.signal(signal.SIGINT, self._handle_shutdown) signal.signal(signal.SIGTERM, self._handle_shutdown) self.logger.info("信号处理器注册完成") def _handle_shutdown(self, signum, frame): """处理退出信号""" self.logger.info(f"收到退出信号 {signum}, 正在关闭应用...") self.running = False if self.job: self.job.stop_job() def _reload_config(self) -> bool: """重新加载配置,返回是否需要重启任务""" try: old_job_id = utils.get_config_int("job.event_id") utils.reload_config() self.interval = utils.get_config_int("job.sleep_interval", 10) new_job_id = utils.get_config_int("job.event_id") return old_job_id != new_job_id except Exception as e: self.logger.error(f"重新加载配置失败: {e}") return False def _check_reload(self, now: datetime.datetime): """检查是否需要重新加载配置""" try: # 每小时整点重新加载配置 if now.minute == 0 and now.second <= self.interval: self.logger.info("开始重新加载配置...") if self._reload_config(): self.logger.info("任务ID已更新,重启任务...") self.job.restart_job() else: self.logger.info("配置重新加载完成,无需重启任务") except Exception as e: self.logger.error(f"检查重新加载配置失败: {e}") def run(self): """运行应用程序""" try: self.logger.info("正在启动应用程序...") # 初始化任务 self.job = JobRunner() self.job.run_job() self.logger.info(f"应用程序启动成功! 任务执行间隔: {self.interval}秒") # 主循环 while self.running: try: schedule.run_pending() now = datetime.datetime.now() self._check_reload(now) time.sleep(self.interval) except Exception as e: self.logger.error(f"主循环执行异常: {e}") time.sleep(self.interval) except Exception as e: self.logger.error(f"应用程序运行异常: {e}") sys.exit(1) finally: self._cleanup() def _cleanup(self): """清理资源""" self.logger.info("应用程序正在关闭...") if self.job: self.job.stop_job() self.logger.info("应用程序已关闭") if __name__ == "__main__": app = Application() app.run()