NewsAtlas/backend/app/scheduler.py

57 lines
1.7 KiB
Python

import logging
from apscheduler.schedulers.background import BackgroundScheduler
from .conflict import poll_conflict_events
from .config import settings
from .db import SessionLocal
from .ingest import fetch_all
from .markets import poll_markets
log = logging.getLogger("newsatlas.scheduler")
def _run_rss_job() -> None:
session = SessionLocal()
try:
added = fetch_all(session)
log.info("RSS poll complete: %d new articles", added)
finally:
session.close()
def _run_market_job() -> None:
session = SessionLocal()
try:
added = poll_markets(session)
log.info("Market poll complete: %d instruments recorded", added)
finally:
session.close()
def _run_conflict_job() -> None:
session = SessionLocal()
try:
added = poll_conflict_events(session)
log.info("Conflict-event poll complete: %d new events", added)
finally:
session.close()
def start_scheduler() -> BackgroundScheduler:
scheduler = BackgroundScheduler(timezone="UTC")
scheduler.add_job(_run_rss_job, "interval", minutes=settings.rss_poll_minutes, next_run_time=None)
scheduler.add_job(_run_market_job, "interval", minutes=settings.market_poll_minutes, next_run_time=None)
scheduler.add_job(_run_conflict_job, "interval", minutes=settings.conflict_poll_minutes, next_run_time=None)
scheduler.start()
# Kick off an immediate first run of each job in the background so the
# globe isn't empty while waiting for the first interval to elapse.
import datetime as dt
now = dt.datetime.utcnow()
for job in scheduler.get_jobs():
job.modify(next_run_time=now)
return scheduler