101 lines
2.6 KiB
Python
101 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright (c) 2015-2016 ACSONE SA/NV (<http://acsone.eu>)
|
|
# Copyright 2016 Camptocamp SA
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
|
|
|
|
import logging
|
|
import os
|
|
import sys
|
|
from threading import Thread
|
|
import time
|
|
|
|
from odoo.service import server
|
|
from odoo.tools import config
|
|
|
|
from .runner import QueueJobRunner
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
START_DELAY = 5
|
|
|
|
|
|
# Here we monkey patch the Odoo server to start the job runner thread
|
|
# in the main server process (and not in forked workers). This is
|
|
# very easy to deploy as we don't need another startup script.
|
|
|
|
|
|
class QueueJobRunnerThread(Thread):
|
|
|
|
def __init__(self):
|
|
Thread.__init__(self)
|
|
self.daemon = True
|
|
port = os.environ.get('ODOO_QUEUE_JOB_PORT') or config['http_port']
|
|
self.runner = QueueJobRunner(port or 8069)
|
|
|
|
def run(self):
|
|
# sleep a bit to let the workers start at ease
|
|
time.sleep(START_DELAY)
|
|
self.runner.run()
|
|
|
|
def stop(self):
|
|
self.runner.stop()
|
|
|
|
|
|
runner_thread = None
|
|
|
|
orig_prefork_start = server.PreforkServer.start
|
|
orig_prefork_stop = server.PreforkServer.stop
|
|
orig_threaded_start = server.ThreadedServer.start
|
|
orig_threaded_stop = server.ThreadedServer.stop
|
|
|
|
|
|
def prefork_start(server, *args, **kwargs):
|
|
global runner_thread
|
|
res = orig_prefork_start(server, *args, **kwargs)
|
|
if not config['stop_after_init']:
|
|
_logger.info("starting jobrunner thread (in prefork server)")
|
|
runner_thread = QueueJobRunnerThread()
|
|
runner_thread.start()
|
|
return res
|
|
|
|
|
|
def prefork_stop(server, graceful=True):
|
|
global runner_thread
|
|
if runner_thread:
|
|
runner_thread.stop()
|
|
res = orig_prefork_stop(server, graceful)
|
|
if runner_thread:
|
|
runner_thread.join()
|
|
runner_thread = None
|
|
return res
|
|
|
|
|
|
def threaded_start(server, *args, **kwargs):
|
|
global runner_thread
|
|
res = orig_threaded_start(server, *args, **kwargs)
|
|
if not config['stop_after_init']:
|
|
_logger.info("starting jobrunner thread (in threaded server)")
|
|
runner_thread = QueueJobRunnerThread()
|
|
runner_thread.start()
|
|
return res
|
|
|
|
|
|
def threaded_stop(server):
|
|
global runner_thread
|
|
if runner_thread:
|
|
runner_thread.stop()
|
|
res = orig_threaded_stop(server)
|
|
if runner_thread:
|
|
runner_thread.join()
|
|
runner_thread = None
|
|
return res
|
|
|
|
|
|
server.PreforkServer.start = prefork_start
|
|
server.PreforkServer.stop = prefork_stop
|
|
if sys.platform == "win32" :
|
|
server.ThreadedServer.start = orig_threaded_start
|
|
else :
|
|
server.ThreadedServer.start = threaded_start
|
|
server.ThreadedServer.stop = threaded_stop
|