main.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import datetime
  2. import signal
  3. import sys
  4. import time
  5. from typing import Optional
  6. import schedule
  7. import utils
  8. from jobs.job_runner import JobRunner
  9. class Application:
  10. """应用程序主类"""
  11. def __init__(self):
  12. """初始化应用程序"""
  13. self._init_logger()
  14. self._init_config()
  15. self._init_signal_handlers()
  16. def _init_logger(self):
  17. """初始化日志系统"""
  18. self.logger = utils.get_logger()
  19. self.logger.info("日志系统初始化完成")
  20. def _init_config(self):
  21. """初始化配置"""
  22. self.running = True
  23. self.job: Optional[JobRunner] = None
  24. self.interval = utils.get_config_int("job.sleep_interval", 10)
  25. self.logger.info(f"配置加载完成, 任务检查间隔: {self.interval}秒")
  26. def _init_signal_handlers(self):
  27. """初始化信号处理器"""
  28. signal.signal(signal.SIGINT, self._handle_shutdown)
  29. signal.signal(signal.SIGTERM, self._handle_shutdown)
  30. self.logger.info("信号处理器注册完成")
  31. def _handle_shutdown(self, signum, frame):
  32. """处理退出信号"""
  33. self.logger.info(f"收到退出信号 {signum}, 正在关闭应用...")
  34. self.running = False
  35. if self.job:
  36. self.job.stop_job()
  37. def _reload_config(self) -> bool:
  38. """重新加载配置,返回是否需要重启任务"""
  39. try:
  40. old_job_id = utils.get_config_int("job.event_id")
  41. utils.reload_config()
  42. self.interval = utils.get_config_int("job.sleep_interval", 10)
  43. new_job_id = utils.get_config_int("job.event_id")
  44. return old_job_id != new_job_id
  45. except Exception as e:
  46. self.logger.error(f"重新加载配置失败: {e}")
  47. return False
  48. def _check_reload(self, now: datetime.datetime):
  49. """检查是否需要重新加载配置"""
  50. try:
  51. # 每小时整点重新加载配置
  52. if now.minute == 0 and now.second <= self.interval:
  53. self.logger.info("开始重新加载配置...")
  54. if self._reload_config():
  55. self.logger.info("任务ID已更新,重启任务...")
  56. self.job.restart_job()
  57. else:
  58. self.logger.info("配置重新加载完成,无需重启任务")
  59. except Exception as e:
  60. self.logger.error(f"检查重新加载配置失败: {e}")
  61. def run(self):
  62. """运行应用程序"""
  63. try:
  64. self.logger.info("正在启动应用程序...")
  65. # 初始化任务
  66. self.job = JobRunner()
  67. self.job.run_job()
  68. self.logger.info(f"应用程序启动成功! 任务执行间隔: {self.interval}秒")
  69. # 主循环
  70. while self.running:
  71. try:
  72. schedule.run_pending()
  73. now = datetime.datetime.now()
  74. self._check_reload(now)
  75. time.sleep(self.interval)
  76. except Exception as e:
  77. self.logger.error(f"主循环执行异常: {e}")
  78. time.sleep(self.interval)
  79. except Exception as e:
  80. self.logger.error(f"应用程序运行异常: {e}")
  81. sys.exit(1)
  82. finally:
  83. self._cleanup()
  84. def _cleanup(self):
  85. """清理资源"""
  86. self.logger.info("应用程序正在关闭...")
  87. if self.job:
  88. self.job.stop_job()
  89. self.logger.info("应用程序已关闭")
  90. if __name__ == "__main__":
  91. app = Application()
  92. app.run()