import json import datetime from models.base import with_session from models.edatask import EDATaskJob from tasks import app from utils.logging import logging def pickup_running_jobs(): tasks_mapper = {} for name, fn in app.tasks.items(): if name.startswith("celery."): continue tasks_mapper[name] = fn one_hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1) with with_session() as s: for i in EDATaskJob.get_all_running_jobs_after(s, one_hour_ago): if not (i.fn_name and i.fn_args): logging.info("ignore job %s as fn_name or fn_args is empty", i.job_id) continue if i.fn_name not in tasks_mapper: logging.info("ignore job %s as job is not registed", i.job_id) continue fn = tasks_mapper[i.fn_name] fn_args = json.loads(i.fn_args) args = fn_args.get("args", tuple()) kwargs = fn_args.get("kwargs", tuple()) job_id = i.job_id logging.info("re-apply job %s with job_id %s", i.fn_name, job_id) fn.apply_async(args=args, kwargs=kwargs, task_id=job_id) if __name__ == "__main__": pickup_running_jobs()