lib.itmens/common/models.py
2023-10-22 17:46:34 -04:00

72 lines
1.7 KiB
Python

from datetime import timedelta
import django_rq
from loguru import logger
from rq.job import Job
from rq.registry import ScheduledJobRegistry
class BaseJob:
interval = timedelta(seconds=1)
@classmethod
def cancel(cls):
job_id = cls.__name__
try:
job = Job.fetch(id=job_id, connection=django_rq.get_connection("cron"))
if job.get_status() in ["queued", "scheduled"]:
logger.info(f"Cancel queued job: {job_id}")
job.cancel()
registry = ScheduledJobRegistry(queue=django_rq.get_queue("cron"))
registry.remove(job)
except:
pass
@classmethod
def schedule(cls):
job_id = cls.__name__
logger.info(f"Scheduling job: {job_id}")
django_rq.get_queue("cron").enqueue_in(
cls.interval, cls._run, job_id=job_id, result_ttl=0, failure_ttl=0
)
@classmethod
def _run(cls):
cls.schedule() # schedule next run
cls().run()
def run(self):
pass
class JobManager:
registry = set()
@classmethod
def register(cls, target):
cls.registry.add(target)
return target
@classmethod
def schedule(cls):
for j in cls.registry:
j.schedule()
@classmethod
def cancel(cls):
for j in cls.registry:
j.cancel()
@classmethod
def run(cls, job_id):
for j in cls.registry:
if j.__name__ == job_id:
logger.info(f"Run job: {job_id}")
j().run()
return True
return False
@classmethod
def get_scheduled_job_ids(cls):
registry = ScheduledJobRegistry(queue=django_rq.get_queue("cron"))
return registry.get_job_ids()