123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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()
|