task_app.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import logging
  2. from quart_cors import cors
  3. from quart import Quart
  4. from app.core.bootstrap import AppContext
  5. from app.core.dependency import ServerContainer
  6. from app.api.v1.routes import server_routes
  7. from app.jobs.task_lifecycle import TaskLifecycleManager
  8. from app.core.observability import AlertService
  9. from app.infra.external import feishu_robot
  10. logging.basicConfig(level=logging.INFO)
  11. app = Quart(__name__)
  12. app = cors(app, allow_origin="*")
  13. app.config["ACCEPTING_TASKS"] = True
  14. server_container = ServerContainer()
  15. ctx = AppContext(server_container)
  16. config = server_container.config()
  17. log_service = server_container.log_service()
  18. mysql_manager = server_container.mysql_manager()
  19. routes = server_routes(mysql_manager, log_service, config)
  20. app.register_blueprint(routes)
  21. @app.before_serving
  22. async def startup():
  23. logging.info("Starting application...")
  24. await ctx.start_up()
  25. # 初始化 AlertService
  26. alert_service = AlertService.initialize(feishu_robot)
  27. await alert_service.start()
  28. # 初始化 TaskLifecycleManager
  29. lifecycle = TaskLifecycleManager.initialize(mysql_manager, poll_interval=5.0)
  30. await lifecycle.start_polling()
  31. logging.info("Application started successfully")
  32. @app.after_serving
  33. async def shutdown():
  34. logging.info("Shutting down application...")
  35. # 阶段 1:停止接收新任务
  36. app.config["ACCEPTING_TASKS"] = False
  37. logging.info("Phase 1: Stopped accepting new tasks")
  38. # 阶段 2:取消/等待存量任务
  39. lifecycle = TaskLifecycleManager.get_instance()
  40. if lifecycle:
  41. await lifecycle.shutdown(timeout=30.0)
  42. logging.info("Phase 2: All tasks cancelled/completed")
  43. # 阶段 3:flush 告警和日志
  44. alert_service = AlertService.get_instance()
  45. if alert_service:
  46. await alert_service.stop(drain_timeout=5.0)
  47. await log_service.stop(drain_timeout=10.0)
  48. logging.info("Phase 3: Alerts and logs flushed")
  49. # 阶段 4:关闭数据库连接
  50. await ctx.shutdown()
  51. logging.info("Phase 4: Database pools closed")
  52. logging.info("Application shutdown successfully")