add support for after jobs (running them in threads) (#6735)

This commit is contained in:
Frédéric Péters 2014-01-05 12:15:19 +01:00
parent 0de5efb88a
commit 263edfbf2a
7 changed files with 33 additions and 2 deletions

View File

@ -28,6 +28,10 @@ import wcs.qommon.sms
import qommon.sms
from qommon.errors import ConnectionError
import wcs.middleware
wcs.middleware.AfterJobsMiddleware.ASYNC = False
class KnownElements(object):
pickle_app_dir = None
sql_app_dir = None

View File

@ -168,6 +168,8 @@ class CompatWcsPublisher(WcsPublisher):
continue
django_response[name] = value
django_response.after_jobs = response.after_jobs
self._clear_request()
return django_response

View File

@ -18,6 +18,7 @@ import thread
import threading
from quixote import get_publisher
from .qommon.http_response import HTTPResponse
from .compat import CompatHTTPRequest, CompatWcsPublisher
@ -31,3 +32,19 @@ class PublisherInitialisationMiddleware(object):
pub.init_publish(compat_request)
pub._set_request(compat_request)
request._publisher = pub
class AfterJobsMiddleware(object):
ASYNC = True
def process_response(self, request, response):
if hasattr(response, 'after_jobs') and response.after_jobs:
http_response = HTTPResponse()
http_response.after_jobs = response.after_jobs
if self.ASYNC:
thread.start_new_thread(
http_response.process_after_jobs,
(get_publisher(),))
else:
http_response.process_after_jobs()
return response

View File

@ -32,10 +32,13 @@ class Publisher(quixote.publish.Publisher):
PublisherOrig.__init__(self, root_directory, *args, **kwargs)
except RuntimeError:
pass
_thread_local.publisher = self
self.set_in_thread()
self.root_directory = root_directory
self._request = None
def set_in_thread(self):
_thread_local.publisher = self
def get_publisher():
return getattr(_thread_local, 'publisher', None)

View File

@ -237,6 +237,7 @@ def email(subject, mail_body, email_rcpt, replyto = None, bcc = None,
else:
msg_from = msg['From']
print 'sending email', msg['To']
if not fire_and_forget:
s = create_smtp_server(emails_cfg, smtp_timeout=smtp_timeout)
try:

View File

@ -139,10 +139,13 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
self.after_jobs.append((job, cmd))
return job
def process_after_jobs(self):
def process_after_jobs(self, publisher=None):
if not self.after_jobs:
return
if publisher:
publisher.set_in_thread()
for job, job_function in self.after_jobs:
if job.completion_time:
continue

View File

@ -103,6 +103,7 @@ MIDDLEWARE_CLASSES = (
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'wcs.compat.PublishErrorMiddleware',
'wcs.middleware.AfterJobsMiddleware',
)
ROOT_URLCONF = 'wcs.urls'