import logging from apscheduler.schedulers.background import BackgroundScheduler from django_apscheduler.jobstores import DjangoJobStore from django_apscheduler import util from django.conf import settings from django.core.management import call_command from django.db import connections from django.db.utils import OperationalError import time logger = logging.getLogger(__name__) def run_worldtravel_seed(): logger.info("Starting worldtravel-seed job") try: call_command('worldtravel-seed', '--force') logger.info("worldtravel-seed job completed successfully") except Exception as e: logger.error(f"Error in worldtravel-seed job: {str(e)}") def database_ready(): db_conn = connections['default'] try: db_conn.cursor() except OperationalError: return False else: return True @util.close_old_connections def start_scheduler(): scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE) scheduler.add_jobstore(DjangoJobStore(), "default") # Wait for the database to be ready retry_count = 0 max_retries = 2 # Set to 2 attempts while not database_ready(): if retry_count >= max_retries: logger.error("Database not available after 2 attempts. Scheduler not started.") return None logger.info("Database not ready. Waiting before retry...") time.sleep(2) # Wait for 2 seconds before retrying retry_count += 1 scheduler.add_job( run_worldtravel_seed, trigger="interval", hours=24, id="worldtravel_seed", max_instances=1, replace_existing=True, ) # scheduler logger.info("Starting scheduler...") scheduler.start() return scheduler