You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.6KB

  1. from celery import Celery
  2. import celery.schedules
  3. from redbeat import RedBeatSchedulerEntry
  4. from datetime import timedelta
  5. from services.redis_service import RedisService
  6. from services.kafka_service import KafkaService
  7. from services.biz_service import BizService
  8. from config import load_config,conf
  9. from urllib.parse import quote
  10. import asyncio,os
  11. load_config()
  12. KAFKA_BOOTSTRAP_SERVERS = conf().get("kafka_bootstrap_servers")
  13. KAFKA_TOPIC = 'topic.ai.ops.wx'
  14. KAFKA_GROUP_ID = 'ai-ops-wx'
  15. redis_host=conf().get("redis_host")
  16. redis_port=conf().get("redis_port")
  17. redis_password=conf().get("redis_password")
  18. redis_db=conf().get("redis_db")
  19. encoded_password = quote(redis_password)
  20. # 配置 Celery
  21. celery_app = Celery(
  22. "worker",
  23. broker=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}",
  24. backend=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}",
  25. include=['tasks']
  26. )
  27. # 配置 redbeat 作为 Celery Beat 调度器
  28. celery_app.conf.update(
  29. timezone="Asia/Shanghai", # 设定时区
  30. beat_scheduler="redbeat.RedBeatScheduler", # 使用 RedBeat 作为调度器
  31. redbeat_redis_url=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}" # redbeat 存储任务调度信息的 Redis
  32. ,
  33. redbeat_lock_timeout=60, # 避免多个 Beat 实例冲突
  34. beat_max_loop_interval=5 # 让 Celery Beat 每 5 秒检查一次任务
  35. )
  36. # task_name = "tasks.scheduled_task"
  37. # # 任务执行间隔(每 10 秒执行一次)
  38. # schedule = celery.schedules.schedule(timedelta(seconds=3))
  39. # # RedBeat 任务唯一 ID
  40. # redbeat_entry = RedBeatSchedulerEntry(
  41. # name="redbeat:scheduled_task", # 任务 ID
  42. # task=task_name, # 任务名称
  43. # schedule=schedule, # 任务调度时间
  44. # args=[],
  45. # app=celery_app
  46. # )
  47. # # 保存任务到 Redis
  48. # redbeat_entry.save()
  49. # tasks_schedule = [
  50. # ("redbeat:scheduled_task", "tasks.scheduled_task", 3),
  51. # ("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15),
  52. # ]
  53. # # 创建并保存 RedBeat 任务
  54. # for task_id, task_name, interval in tasks_schedule:
  55. # redbeat_entry = RedBeatSchedulerEntry(
  56. # name=task_id,
  57. # task=task_name,
  58. # schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  59. # args=[],
  60. # app=celery_app
  61. # )
  62. # redbeat_entry.save()
  63. # 获取配置文件中的 redis_config、kafka_config、gewe_config
  64. redis_config = {
  65. 'host': redis_host,
  66. 'port': redis_port,
  67. 'password': redis_password,
  68. 'db': redis_db,
  69. }
  70. kafka_config = {
  71. 'bootstrap_servers': KAFKA_BOOTSTRAP_SERVERS,
  72. 'topic': KAFKA_TOPIC,
  73. 'group_id': KAFKA_GROUP_ID,
  74. }
  75. gewe_config = {
  76. 'api_url': "http://api.geweapi.com/gewe",
  77. }
  78. scheduled_task_sync_wx_info_interval = 10
  79. environment = os.environ.get('environment', 'default')
  80. if environment != 'default':
  81. scheduled_task_sync_wx_info_interval = 60*11
  82. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔秒, 任务参数)
  83. tasks_schedule = [
  84. #("redbeat:scheduled_task", "tasks.scheduled_task", 3, []),
  85. #("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15, []),
  86. ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info", scheduled_task_sync_wx_info_interval, [redis_config, kafka_config, gewe_config]),
  87. ]
  88. # 注册 RedBeat 任务
  89. for task_id, task_name, interval, task_args in tasks_schedule:
  90. redbeat_entry = RedBeatSchedulerEntry(
  91. name=task_id,
  92. task=task_name,
  93. schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  94. args=task_args,
  95. app=celery_app
  96. )
  97. redbeat_entry.save()