Skip to content
Snippets Groups Projects
Commit f8cd526f authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#9 - schedule automatic job via cron syntax from settings

parent 57912746
Branches
Tags
No related merge requests found
...@@ -32,7 +32,11 @@ ...@@ -32,7 +32,11 @@
"numberOfMeasurementsPerDay": 2, "numberOfMeasurementsPerDay": 2,
"ageInDays": 60 "ageInDays": 60
} }
] ],
"automatic": {
"enable": true,
"cronSchedule": "0 0 * * 0"
}
} }
}, },
"api": { "api": {
......
import json
import os import os
import uvicorn import uvicorn
from TheCodeLabs_BaseUtils.DefaultLogger import DefaultLogger from TheCodeLabs_BaseUtils.DefaultLogger import DefaultLogger
from apscheduler.triggers.cron import CronTrigger
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
...@@ -10,6 +10,8 @@ from starlette.responses import RedirectResponse, FileResponse ...@@ -10,6 +10,8 @@ from starlette.responses import RedirectResponse, FileResponse
from Settings import SETTINGS, VERSION from Settings import SETTINGS, VERSION
from logic import Constants from logic import Constants
from logic.DatabaseCleanupService import DatabaseCleanupService
from logic.Dependencies import get_database
from logic.DiscoveryService import DiscoveryService from logic.DiscoveryService import DiscoveryService
from logic.database import Models from logic.database import Models
from logic.database.Database import engine from logic.database.Database import engine
...@@ -20,7 +22,6 @@ LOGGER = DefaultLogger().create_logger_if_not_exists(Constants.APP_NAME) ...@@ -20,7 +22,6 @@ LOGGER = DefaultLogger().create_logger_if_not_exists(Constants.APP_NAME)
DATABASE_SETTINGS = SETTINGS['database'] DATABASE_SETTINGS = SETTINGS['database']
# create database tables # create database tables
Models.Base.metadata.create_all(bind=engine) Models.Base.metadata.create_all(bind=engine)
...@@ -62,6 +63,21 @@ def overridden_redoc(): ...@@ -62,6 +63,21 @@ def overridden_redoc():
redoc_favicon_url=app.url_path_for('favicon')) redoc_favicon_url=app.url_path_for('favicon'))
@app.on_event("startup")
async def startup_event():
cleanupSettings = SETTINGS['database']['cleanup']
if cleanupSettings['automatic']['enable']:
cleanupService = DatabaseCleanupService(cleanupSettings)
try:
cronTrigger = CronTrigger.from_crontab(cleanupSettings['automatic']['cronSchedule'])
except ValueError as e:
raise ValueError(f'Invalid syntax for settings option "cronSchedule": {str(e)}') from e
from logic import JobScheduler
JobScheduler.SCHEDULER.schedule_automatic_job(cleanupService.cleanup, [next(get_database())], cronTrigger)
app.include_router(GeneralRouter.router) app.include_router(GeneralRouter.router)
app.include_router(DatabaseRouter.router) app.include_router(DatabaseRouter.router)
app.include_router(DeviceRouter.router) app.include_router(DeviceRouter.router)
......
...@@ -5,6 +5,7 @@ from typing import Callable, List ...@@ -5,6 +5,7 @@ from typing import Callable, List
import pytz import pytz
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR, JobExecutionEvent from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR, JobExecutionEvent
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from apscheduler.triggers.cron import CronTrigger
from logic import Constants from logic import Constants
from logic.database import Schemas from logic.database import Schemas
...@@ -45,10 +46,9 @@ class JobScheduler: ...@@ -45,10 +46,9 @@ class JobScheduler:
else: else:
LOGGER.debug(f'Successfully finished job "{event.job_id}" (retval: {event.retval})') LOGGER.debug(f'Successfully finished job "{event.job_id}" (retval: {event.retval})')
def schedule_automatic_job(self, func: Callable, args: List, interval_in_minutes: int): def schedule_automatic_job(self, func: Callable, args: List, cronTrigger: CronTrigger):
self._jobAutomatic = self._jobAutomatic.modify(func=func, args=args) self._jobAutomatic = self._jobAutomatic.modify(func=func, args=args)
self._jobAutomatic = self._jobAutomatic.reschedule(trigger='interval', minutes=interval_in_minutes, self._jobAutomatic = self._jobAutomatic.reschedule(trigger=cronTrigger, timezone=TIMEZONE)
timezone=TIMEZONE)
self._jobStatus[self.ID_AUTO] = self.STATE_RUNNING self._jobStatus[self.ID_AUTO] = self.STATE_RUNNING
def run_manual_job(self, func: Callable, args: List): def run_manual_job(self, func: Callable, args: List):
...@@ -79,4 +79,4 @@ class JobAlreadyRunningError(Exception): ...@@ -79,4 +79,4 @@ class JobAlreadyRunningError(Exception):
pass pass
SCHEDULER = JobScheduler() SCHEDULER: JobScheduler = JobScheduler()
...@@ -37,6 +37,6 @@ async def databaseCleanup(db: Session = Depends(get_database)): ...@@ -37,6 +37,6 @@ async def databaseCleanup(db: Session = Depends(get_database)):
@router.get('/databaseCleanup', @router.get('/databaseCleanup',
summary='Provides the status of the all scheduled database cleanup jobs', summary='Provides the status of the all scheduled database cleanup jobs',
response_model=Schemas.ScheduledJobs) response_model=Schemas.ScheduledJobs)
async def databaseCleanup(): async def getStatus():
from logic import JobScheduler from logic import JobScheduler
return JobScheduler.SCHEDULER.get_scheduled_jobs() return JobScheduler.SCHEDULER.get_scheduled_jobs()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment