from celery import Celery import celery.schedules from redbeat import RedBeatSchedulerEntry from datetime import timedelta from services.redis_service import RedisService from services.kafka_service import KafkaService from services.biz_service import BizService from config import load_config,conf from urllib.parse import quote import asyncio,os load_config() KAFKA_BOOTSTRAP_SERVERS = conf().get("kafka_bootstrap_servers") KAFKA_TOPIC = 'topic.ai.ops.wx' KAFKA_GROUP_ID = 'ai-ops-wx' redis_host=conf().get("redis_host") redis_port=conf().get("redis_port") redis_password=conf().get("redis_password") redis_db=conf().get("redis_db") encoded_password = quote(redis_password) # 配置 Celery celery_app = Celery( "worker", broker=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}", backend=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}", include=['tasks'] ) # 配置 redbeat 作为 Celery Beat 调度器 celery_app.conf.update( timezone="Asia/Shanghai", # 设定时区 beat_scheduler="redbeat.RedBeatScheduler", # 使用 RedBeat 作为调度器 redbeat_redis_url=f"redis://:{encoded_password}@{redis_host}:{redis_port}/{redis_db}" # redbeat 存储任务调度信息的 Redis , redbeat_lock_timeout=60, # 避免多个 Beat 实例冲突 beat_max_loop_interval=5 # 让 Celery Beat 每 5 秒检查一次任务 ) # task_name = "tasks.scheduled_task" # # 任务执行间隔(每 10 秒执行一次) # schedule = celery.schedules.schedule(timedelta(seconds=3)) # # RedBeat 任务唯一 ID # redbeat_entry = RedBeatSchedulerEntry( # name="redbeat:scheduled_task", # 任务 ID # task=task_name, # 任务名称 # schedule=schedule, # 任务调度时间 # args=[], # app=celery_app # ) # # 保存任务到 Redis # redbeat_entry.save() # tasks_schedule = [ # ("redbeat:scheduled_task", "tasks.scheduled_task", 3), # ("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15), # ] # # 创建并保存 RedBeat 任务 # for task_id, task_name, interval in tasks_schedule: # redbeat_entry = RedBeatSchedulerEntry( # name=task_id, # task=task_name, # schedule=celery.schedules.schedule(timedelta(seconds=interval)), # args=[], # app=celery_app # ) # redbeat_entry.save() # 获取配置文件中的 redis_config、kafka_config、gewe_config redis_config = { 'host': redis_host, 'port': redis_port, 'password': redis_password, 'db': redis_db, } kafka_config = { 'bootstrap_servers': KAFKA_BOOTSTRAP_SERVERS, 'topic': KAFKA_TOPIC, 'group_id': KAFKA_GROUP_ID, } gewe_config = { 'api_url': "http://api.geweapi.com/gewe", } scheduled_task_sync_wx_info_interval = 10 environment = os.environ.get('environment', 'default') if environment != 'default': scheduled_task_sync_wx_info_interval = 60*11 # 定义定时任务列表 (任务 ID, 任务名称, 执行间隔秒, 任务参数) tasks_schedule = [ #("redbeat:scheduled_task", "tasks.scheduled_task", 3, []), #("redbeat:scheduled_task_sync_wx", "tasks.scheduled_task_sync_wx", 15, []), ("redbeat:scheduled_task_sync_wx_info", "tasks.scheduled_task_sync_wx_info", scheduled_task_sync_wx_info_interval, [redis_config, kafka_config, gewe_config]), ] # 注册 RedBeat 任务 for task_id, task_name, interval, task_args in tasks_schedule: redbeat_entry = RedBeatSchedulerEntry( name=task_id, task=task_name, schedule=celery.schedules.schedule(timedelta(seconds=interval)), args=task_args, app=celery_app ) redbeat_entry.save()