from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.triggers.cron import CronTrigger from apscheduler.triggers.date import DateTrigger scheduler = AsyncIOScheduler() def start_scheduler(): if not scheduler.running: # Register periodic jobs from app.workers.notification_sender import send_pending_notifications scheduler.add_job( send_pending_notifications, trigger=CronTrigger(second="0", minute="*"), # every minute id="send_pending_notifications", replace_existing=True, ) from app.workers.health_review import run_daily_review scheduler.add_job( run_daily_review, trigger=CronTrigger(hour=8, minute=0), id="daily_review", replace_existing=True, ) scheduler.start() def shutdown_scheduler(): if scheduler.running: scheduler.shutdown(wait=False) def schedule_one_time(job_id: str, run_date, func, **kwargs): scheduler.add_job(func, trigger=DateTrigger(run_date=run_date), id=job_id, replace_existing=True, kwargs=kwargs) def schedule_recurring(job_id: str, cron_expr: str, func, **kwargs): trigger = CronTrigger.from_crontab(cron_expr) scheduler.add_job(func, trigger=trigger, id=job_id, replace_existing=True, kwargs=kwargs)