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.

244 lines
8.3KB

  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. environment = os.environ.get('environment', 'default')
  84. if environment != 'default':
  85. scheduled_task_sync_wx_info_interval = 60*11
  86. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔秒, 任务参数)
  87. # tasks_schedule = [
  88. # #("redbeat:scheduled_task", "tasks.scheduled_task", 3, []),
  89. # #("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15, []),
  90. # ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info", scheduled_task_sync_wx_info_interval, [redis_config, kafka_config, gewe_config]),
  91. # #("redbeat:add_friends_task", "tasks.add_friends_task", random.randint(1, 10), [redis_config]), # 10分钟执行一次
  92. # ]
  93. # # 注册 RedBeat 任务
  94. # for task_id, task_name, interval, task_args in tasks_schedule:
  95. # redbeat_entry = RedBeatSchedulerEntry(
  96. # name=task_id,
  97. # task=task_name,
  98. # schedule=celery.schedules.schedule(timedelta(seconds=interval)),
  99. # args=task_args,
  100. # app=celery_app
  101. # )
  102. # redbeat_entry.save()
  103. # # 为 add_friends_task 生成随机的分钟和小时
  104. random_minute = random.randint(0, 59)
  105. random_hour = random.randint(0, 23) # 可以根据需要调整小时范围
  106. # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔或调度, 任务参数)
  107. tasks_schedule = [
  108. # 其他任务保持不变
  109. ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info",
  110. celery.schedules.schedule(timedelta(seconds=scheduled_task_sync_wx_info_interval)),
  111. [redis_config, kafka_config, gewe_config]),
  112. # # add_friends_task 使用 crontab 随机时间
  113. # ("redbeat:add_friends_task", "tasks.add_friends_task",
  114. # crontab(minute=random_minute, hour='*'), # 每小时在随机分钟执行
  115. # # 如果想每天在随机时间执行,可以用: crontab(minute=random_minute, hour=random_hour)
  116. # [redis_config]),
  117. ]
  118. # # 注册 RedBeat 任务
  119. for task_id, task_name, schedule_obj, task_args in tasks_schedule:
  120. redbeat_entry = RedBeatSchedulerEntry(
  121. name=task_id,
  122. task=task_name,
  123. schedule=schedule_obj, # 现在使用 schedule_obj 而不是创建新的 schedule
  124. args=task_args,
  125. app=celery_app
  126. )
  127. redbeat_entry.save()
  128. # 如果是 add_friends_task,打印其随机调度信息
  129. if task_name == "tasks.add_friends_task":
  130. if isinstance(schedule_obj, crontab):
  131. print(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  132. logger.info(f"已注册 `{task_name}` 任务,将在每小时的第 {random_minute} 分钟执行")
  133. else:
  134. print('scheduled_task_sync_wx_info 定时任务执行成功!')
  135. logger.info(f"scheduled_task_sync_wx_info 定时任务执行成功!")
  136. # def setup_schedule():
  137. # # 初始化第一次执行(例如:15秒后执行)
  138. # initial_run_in = 5
  139. # entry = RedBeatSchedulerEntry(
  140. # name='random-task',
  141. # task='tasks.random_scheduled_task',
  142. # schedule=timedelta(seconds=initial_run_in),
  143. # app=celery_app
  144. # )
  145. # entry.save()
  146. # print(f"Initial task scheduled in {initial_run_in} seconds")
  147. # setup_schedule()
  148. # for task_id, task_name, schedule_obj, task_args in tasks_schedule:
  149. # entry_key = f'redbeat:{task_id}' # RedBeat 任务的键
  150. # existing_entry = None
  151. # try:
  152. # existing_entry = RedBeatSchedulerEntry.from_key(entry_key, app=celery_app)
  153. # except KeyError:
  154. # # 任务不存在
  155. # pass
  156. # print(existing_entry)
  157. # if existing_entry:
  158. # print(f"任务 `{task_name}` 已存在,跳过注册")
  159. # logger.info(f"任务 `{task_name}` 已存在,跳过注册")
  160. # else:
  161. # redbeat_entry = RedBeatSchedulerEntry(
  162. # name=task_id,
  163. # task=task_name,
  164. # schedule=schedule_obj, # 现在使用 schedule_obj 而不是创建新的 schedule
  165. # args=task_args,
  166. # app=celery_app
  167. # )
  168. # redbeat_entry.save()
  169. # if task_name == "tasks.add_friends_task":
  170. # if isinstance(schedule_obj, crontab):
  171. # print(f"已注册 `{task_name}` 任务,将在每小时的第 {schedule_obj._orig_minute} 分钟执行")
  172. # logger.info(f"已注册 `{task_name}` 任务,将在每小时的第 {schedule_obj._orig_minute} 分钟执行")
  173. # else:
  174. # print("scheduled_task_sync_wx_info 定时任务执行成功!")
  175. # logger.info("scheduled_task_sync_wx_info 定时任务执行成功!")
  176. # # **仅在首次启动时,手动注册 RedBeat 任务**
  177. # def register_initial_tasks():
  178. # try:
  179. # # 生成一个随机的首次任务执行间隔(5-15 分钟)
  180. # initial_interval = random.randint(1, 3)
  181. # #initial_interval=
  182. # # RedBeat 任务注册
  183. # redbeat_entry = RedBeatSchedulerEntry(
  184. # name="redbeat:add_friends_task",
  185. # task="tasks.add_friends_task",
  186. # schedule=celery.schedules.schedule(timedelta(seconds=initial_interval)),
  187. # args=[redis_config],
  188. # app=celery_app
  189. # )
  190. # redbeat_entry.save()
  191. # print(f"已注册 `tasks.add_friends_task` 任务,首次将在 {initial_interval} 秒后执行")
  192. # except Exception as e:
  193. # print(f"任务注册失败: {e}")
  194. # register_initial_tasks()
  195. #add_friends_task.apply_async(args=[redis_config])
  196. #trigger_initial_task()