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.

188 line
6.4KB

  1. #from celery import Celery
  2. import celery.schedules
  3. from redbeat import RedBeatSchedulerEntry
  4. from datetime import timedelta
  5. from celery.schedules import crontab
  6. from celery_config import *
  7. from services.redis_service import RedisService
  8. from services.kafka_service import KafkaService
  9. from services.biz_service import BizService
  10. #from config import load_config,conf
  11. from urllib.parse import quote
  12. import asyncio,os,random,sys
  13. #from tasks import add_friends_task
  14. from common.log import logger
  15. # load_config()
  16. # KAFKA_BOOTSTRAP_SERVERS = conf().get("kafka_bootstrap_servers")
  17. # KAFKA_TOPIC = 'topic.ai.ops.wx'
  18. # KAFKA_GROUP_ID = 'ai-ops-wx'
  19. # redis_host=conf().get("redis_host")
  20. # redis_port=conf().get("redis_port")
  21. # redis_password=conf().get("redis_password")
  22. # redis_db=conf().get("redis_db")
  23. # encoded_password = quote(redis_password)
  24. # # 配置 Celery
  25. # celery_app = Celery(
  26. # "worker",
  27. # broker=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}",
  28. # backend=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}",
  29. # include=['tasks']
  30. # )
  31. # # 配置 redbeat 作为 Celery Beat 调度器
  32. # celery_app.conf.update(
  33. # timezone="Asia/Shanghai", # 设定时区
  34. # beat_scheduler="redbeat.RedBeatScheduler", # 使用 RedBeat 作为调度器
  35. # redbeat_redis_url=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}" # redbeat 存储任务调度信息的 Redis
  36. # ,
  37. # redbeat_lock_timeout=60, # 避免多个 Beat 实例冲突
  38. # beat_max_loop_interval=5 # 让 Celery Beat 每 5 秒检查一次任务
  39. # )
  40. # task_name = "tasks.scheduled_task"
  41. # # 任务执行间隔(每 10 秒执行一次)
  42. # schedule = celery.schedules.schedule(timedelta(seconds=3))
  43. # # RedBeat 任务唯一 ID
  44. # redbeat_entry = RedBeatSchedulerEntry(
  45. # name="redbeat:scheduled_task", # 任务 ID
  46. # task=task_name, # 任务名称
  47. # schedule=schedule, # 任务调度时间
  48. # args=[],
  49. # app=celery_app
  50. # )
  51. # # 保存任务到 Redis
  52. # redbeat_entry.save()
  53. # tasks_schedule = [
  54. # ("redbeat:scheduled_task", "tasks.scheduled_task", 3),
  55. # ("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15),
  56. # ]
  57. # # 创建并保存 RedBeat 任务
  58. # for task_id, task_name, interval in tasks_schedule:
  59. # redbeat_entry = RedBeatSchedulerEntry(
  60. # name=task_id,
  61. # task=task_name,
  62. # schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  63. # args=[],
  64. # app=celery_app
  65. # )
  66. # redbeat_entry.save()
  67. # # 获取配置文件中的 redis_config、kafka_config、gewe_config
  68. # redis_config = {
  69. # 'host': redis_host,
  70. # 'port': redis_port,
  71. # 'password': redis_password,
  72. # 'db': redis_db,
  73. # }
  74. # kafka_config = {
  75. # 'bootstrap_servers': KAFKA_BOOTSTRAP_SERVERS,
  76. # 'topic': KAFKA_TOPIC,
  77. # 'group_id': KAFKA_GROUP_ID,
  78. # }
  79. # gewe_config = {
  80. # 'api_url': "http://api.geweapi.com/gewe",
  81. # }
  82. scheduled_task_sync_wx_info_interval = 6000
  83. scheduled_task_add_contacts_from_chatrooms_interval=10
  84. environment = os.environ.get('environment', 'default')
  85. if environment != 'default':
  86. scheduled_task_sync_wx_info_interval = 60*11
  87. scheduled_task_add_contacts_from_chatrooms_interval = 3600*24
  88. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔秒, 任务参数)
  89. # tasks_schedule = [
  90. # #("redbeat:scheduled_task", "tasks.scheduled_task", 3, []),
  91. # #("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15, []),
  92. # ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info", scheduled_task_sync_wx_info_interval, [redis_config, kafka_config, gewe_config]),
  93. # #("redbeat:add_friends_task", "tasks.add_friends_task", random.randint(1, 10), [redis_config]), # 10分钟执行一次
  94. # ]
  95. # # 注册 RedBeat 任务
  96. # for task_id, task_name, interval, task_args in tasks_schedule:
  97. # redbeat_entry = RedBeatSchedulerEntry(
  98. # name=task_id,
  99. # task=task_name,
  100. # schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  101. # args=task_args,
  102. # app=celery_app
  103. # )
  104. # redbeat_entry.save()
  105. # # 为 add_friends_task 生成随机的分钟和小时
  106. random_minute = random.randint(0, 59)
  107. random_hour = random.randint(0, 23) # 可以根据需要调整小时范围
  108. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔或调度, 任务参数)
  109. tasks_schedule = [
  110. # 其他任务保持不变
  111. ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info",
  112. celery.schedules.schedule(timedelta(seconds=scheduled_task_sync_wx_info_interval)),
  113. [redis_config, kafka_config, gewe_config]),
  114. # # add_friends_task 使用 crontab 随机时间
  115. # ("redbeat:add_friends_task", "tasks.add_friends_task",
  116. # crontab(minute=random_minute, hour='*'), # 每小时在随机分钟执行
  117. # # 如果想每天在随机时间执行,可以用: crontab(minute=random_minute, hour=random_hour)
  118. # [redis_config]),
  119. ("redbeat:scheduled_task_add_contacts_from_chatrooms", "tasks.scheduled_task_add_contacts_from_chatrooms",
  120. celery.schedules.schedule(timedelta(seconds=scheduled_task_add_contacts_from_chatrooms_interval)),
  121. [redis_config, kafka_config, gewe_config]),
  122. ]
  123. # # 注册 RedBeat 任务
  124. for task_id, task_name, schedule_obj, task_args in tasks_schedule:
  125. redbeat_entry = RedBeatSchedulerEntry(
  126. name=task_id,
  127. task=task_name,
  128. schedule=schedule_obj, # 现在使用 schedule_obj 而不是创建新的 schedule
  129. args=task_args,
  130. app=celery_app
  131. )
  132. redbeat_entry.save()
  133. # 如果是 add_friends_task,打印其随机调度信息
  134. if task_name == "tasks.add_friends_task":
  135. if isinstance(schedule_obj, crontab):
  136. print(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  137. logger.info(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  138. else:
  139. print('scheduled_task_sync_wx_info 定时任务执行成功!')
  140. logger.info(f"scheduled_task_sync_wx_info 定时任务执行成功!")
  141. def setup_schedule():
  142. # 初始化第一次执行(例如:15秒后执行)
  143. initial_run_in = 5
  144. entry = RedBeatSchedulerEntry(
  145. name='random-task',
  146. task='tasks.random_scheduled_task',
  147. schedule=timedelta(seconds=initial_run_in),
  148. app=celery_app
  149. )
  150. entry.save()
  151. print(f"Initial task scheduled in {initial_run_in} seconds")
  152. setup_schedule()