diff --git a/app/app.py b/app/app.py index 785adb7..4893c55 100644 --- a/app/app.py +++ b/app/app.py @@ -8,9 +8,10 @@ from misc import datetime, date, time, currDay, prevDay, ZoneInfo, currVersion, from db import (db, Period, Task, Event, User) from sqlalchemy import inspect from forms import (TaskForm, EventForm, PeriodForm, SignupForm, LoginForm, SettingsForm) -from create_events import createEvents from log import appLogger +from worker import runCreateEvents + # init logger logger = appLogger('app') @@ -183,7 +184,7 @@ def newPeriod(): db.session.commit() logger.info(f'New period added by \'{current_user.userName}\' from {sourceIP}') # Run createEvents upon adding new period - createEvents(db, currDay, Period, Event) + runCreateEvents() return redirect(f'/period/edit/{period.period}') return render_template('newPeriod.html', form=form) diff --git a/app/requirements.txt b/app/requirements.txt index 3e68a82..95eab1e 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -26,6 +26,10 @@ WTForms-SQLAlchemy==0.3.0 # APScheduler automated scheduler APScheduler==3.10.1 +# Celery Task Queue +celery[redis]==5.2.7 +redis==4.5.4 + # Python Time packages pytz==2022.7.1 diff --git a/app/worker.py b/app/worker.py index 288a29e..ae9541d 100644 --- a/app/worker.py +++ b/app/worker.py @@ -1,9 +1,10 @@ +from celery import Celery +from celery.schedules import crontab +from create_events import createEvents import os from flask import Flask from misc import currDay, datetime, time, timedelta from db import db, Period, Event -from create_events import createEvents -from apscheduler.schedulers.background import BlockingScheduler basedir = os.path.abspath(os.path.dirname(__file__)) @@ -18,18 +19,24 @@ app.config['SQLALCHEMY_DATABASE_URI'] =\ app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) -# Define function to run create_events with app context -def run_create_events(): +redis_url = 'redis://' + \ + os.environ['REDIS_HOST'] + \ + ':' + os.environ['REDIS_PORT'] + \ + '/' + os.environ['REDIS_DBNUM'] + +celerymsg = Celery('tasks', backend=redis_url, broker=redis_url) + +# Task definitions +@celerymsg.task +def runCreateEvents(): with app.app_context(): createEvents(db, currDay, Period, Event) -# Call createEvents on initial launch of the script -run_create_events() - - -# Set up scheduler to run function at 59th minute of every hour -scheduler = BlockingScheduler() -scheduler.add_job(run_create_events, 'cron', minute=59) - -# Start scheduler -scheduler.start() \ No newline at end of file +# Scheduled tasks +celerymsg.conf.beat_schedule = { + 'hourly-createevents': { + 'task': 'worker.runCreateEvents', + # Run hourly + 'schedule': crontab(hour="*"), + } +} \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index c811c2a..600d3dc 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,31 +9,43 @@ services: - MYSQL_HOST=db - MYSQL_PORT=3306 - MYSQL_DB=bellscheduler + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_DBNUM=0 - SECRET_KEY=notasecuresecretkeyonlyuseforlocaldevelopment - NODE_NAME=local - POD_NAME=local - FLASK_ENV=development - FLASK_DEBUG=1 - PYTHONUNBUFFERED=1 + - SIGNUP_ENABLED=YES ports: - 127.0.0.1:80:80 worker: image: container-registry.infra.dubyatp.xyz/bellscheduler/app:latest-testing restart: always - entrypoint: python3 - command: "-m worker" + entrypoint: celery + command: "-A worker.celerymsg worker --loglevel=DEBUG -B" environment: - MYSQL_USER=root - MYSQL_PASSWORD=notasecuresecretkeyonlyuseforlocaldevelopment - MYSQL_HOST=db - MYSQL_PORT=3306 - MYSQL_DB=bellscheduler + - REDIS_HOST=redis + - REDIS_PORT=6379 + - REDIS_DBNUM=0 - SECRET_KEY=notasecuresecretkeyonlyuseforlocaldevelopment - NODE_NAME=local - POD_NAME=local - FLASK_ENV=development - FLASK_DEBUG=1 - PYTHONUNBUFFERED=1 + redis: + image: redis:7.0.10-alpine3.17 + restart: always + ports: + - 127.0.0.1:6379:6379 db: image: mariadb:10.7.8-focal restart: always