add scheduler middleware

This commit is contained in:
Jakub Miazek 2024-10-16 15:32:32 +02:00
parent 171a8019f7
commit a63c3e2a43
2 changed files with 11 additions and 8 deletions

View File

@ -77,5 +77,5 @@ app.add_middleware(SchedulerMiddleware, scheduler=_scheduler_himself)
# TODO: every not GET meth should reset cache # 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 # TODO: https://stackoverflow.com/questions/16053364/make-sure-only-one-worker-launches-the-apscheduler-event-in-a-pyramid-web-app-ru

View File

@ -1,23 +1,26 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import text
from starlette.types import ASGIApp, Receive, Scope, Send from starlette.types import ASGIApp, Receive, Scope, Send
from apscheduler import AsyncScheduler from apscheduler import AsyncScheduler
from apscheduler.triggers.interval import IntervalTrigger from apscheduler.triggers.interval import IntervalTrigger
from app.database import AsyncSessionFactory
from app.utils.logging import AppLogger from app.utils.logging import AppLogger
logger = AppLogger().get_logger() logger = AppLogger().get_logger()
def tick(): async def tick():
async with AsyncSessionFactory() as session:
logger.info(f">>>> Be or not to be...{datetime.now()}") 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: class SchedulerMiddleware:
# TODO: need access to request to be able to get db conn pool
def __init__( def __init__(
self, self,
app: ASGIApp, app: ASGIApp,
@ -30,7 +33,7 @@ class SchedulerMiddleware:
if scope["type"] == "lifespan": if scope["type"] == "lifespan":
async with self.scheduler: async with self.scheduler:
await self.scheduler.add_schedule( 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.scheduler.start_in_background()
await self.app(scope, receive, send) await self.app(scope, receive, send)