From 73ebc06275ddcf763d6073e47d541a2d990bd69d Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 23 May 2014 17:01:25 -0400 Subject: [PATCH] Explicitly close all connection for any scheduled task, ref issue #4 --- apps/scheduler/api.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/scheduler/api.py b/apps/scheduler/api.py index 86d7da1cd2..9be1931835 100644 --- a/apps/scheduler/api.py +++ b/apps/scheduler/api.py @@ -1,11 +1,33 @@ from __future__ import absolute_import +from functools import wraps + +from django import db + from .exceptions import AlreadyScheduled from .runtime import scheduler registered_jobs = {} +def close_connections(func): + """ + Wrapper that closes all db connection before and after execution of + its wrapped function + """ + + @wraps(func) + def wrapper(*args, **kwargs): + # This ensures the task gets a fresh db connection + db.close_connection() + result = func(*args, **kwargs) + # This ensures no open connections remain after the task finishes executing + db.close_connection() + return result + + return wrapper + + def register_interval_job(name, title, func, weeks=0, days=0, hours=0, minutes=0, seconds=0, start_date=None, args=None, kwargs=None, job_name=None, **options): @@ -13,7 +35,8 @@ def register_interval_job(name, title, func, weeks=0, days=0, hours=0, minutes=0 if name in registered_jobs: raise AlreadyScheduled - job = scheduler.add_interval_job(func=func, weeks=weeks, days=days, + # Wrap the user function before adding it to the scheduler + job = scheduler.add_interval_job(func=close_connections(func), weeks=weeks, days=days, hours=hours, minutes=minutes, seconds=seconds, start_date=start_date, args=args, kwargs=kwargs, **options)