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.

пре 1 месец
пре 4 недеља
пре 1 месец
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 1 месец
пре 4 недеља
пре 1 месец
пре 3 недеља
пре 4 недеља
пре 1 месец
пре 4 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 3 недеља
пре 4 недеља
пре 3 недеља
пре 4 недеља
пре 3 недеља
пре 4 недеља
пре 3 недеља
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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()