From a63c3e2a437ca316b94c550274695168448af096 Mon Sep 17 00:00:00 2001 From: Jakub Miazek Date: Wed, 16 Oct 2024 15:32:32 +0200 Subject: [PATCH] add scheduler middleware --- app/main.py | 2 +- app/services/scheduler.py | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/main.py b/app/main.py index 243220a..ffe4b2c 100644 --- a/app/main.py +++ b/app/main.py @@ -77,5 +77,5 @@ app.add_middleware(SchedulerMiddleware, scheduler=_scheduler_himself) # TODO: every not GET meth should reset cache -# TODO: every scheduler task which needs to act on database hsould have access to connection pool via request +# TODO: every scheduler task which needs to act on database should have access to connection pool via request - maybe ? # TODO: https://stackoverflow.com/questions/16053364/make-sure-only-one-worker-launches-the-apscheduler-event-in-a-pyramid-web-app-ru diff --git a/app/services/scheduler.py b/app/services/scheduler.py index 74fc192..559c0cd 100644 --- a/app/services/scheduler.py +++ b/app/services/scheduler.py @@ -1,23 +1,26 @@ from datetime import datetime +from sqlalchemy import text from starlette.types import ASGIApp, Receive, Scope, Send - from apscheduler import AsyncScheduler from apscheduler.triggers.interval import IntervalTrigger +from app.database import AsyncSessionFactory from app.utils.logging import AppLogger logger = AppLogger().get_logger() -def tick(): - - logger.info(f">>>> Be or not to be...{datetime.now()}") +async def tick(): + async with AsyncSessionFactory() as session: + stmt = text("select 1;") + logger.info(f">>>> Be or not to be...{datetime.now()}") + result = await session.execute(stmt) + logger.info(f">>>> Result: {result.scalar()}") + return True class SchedulerMiddleware: - # TODO: need access to request to be able to get db conn pool - def __init__( self, app: ASGIApp, @@ -30,7 +33,7 @@ class SchedulerMiddleware: if scope["type"] == "lifespan": async with self.scheduler: await self.scheduler.add_schedule( - tick, IntervalTrigger(seconds=25), id="tick" + tick, IntervalTrigger(seconds=25), id="tick-sql-25" ) await self.scheduler.start_in_background() await self.app(scope, receive, send)