如何在其他环境上运行odoo自动计划(Cron作业)

时间:2018-09-27 01:42:04

标签: scheduled-tasks

我有一些计划的操作来生成报告,这些报告需要数百万甚至数十亿的原始数据,每当计划的操作在后端运行时,服务器的性能就会受到影响,并且当用户访问系统速度变慢时。现在的想法是在另一个环境上执行所有计划的操作,以免消耗生产环境资源。

所以我要有3种环境:

  1. 数据库环境
  2. 生产环境
  3. 其他环境

从生产环境中复制“其他环境”以运行所有计划的操作。两种环境都将连接到数据库环境。

我的问题是如何配置ir.cron,以便在生产环境中不运行调度程序,而是在其他环境中运行它?

OR

任何建议实现我的目标的另一种方法,那就是在另一种环境上进行繁重的工作?

请帮助。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

我正在使用threadingOdoo web service API来实现自己的目标。

首先,我为所有瞬态模型创建一个报告类库,以使用打印操作方法和模型捕获该图像,然后在执行之前,我使用线程将操作扔到另一个称为QMS(队列管理系统)环境的环境中进行处理它的动作方法。

# -*- coding: utf-8 -*-

import xmlrpclib
import logging
from functools import partial

from odoo import _, api, fields, models, registry, SUPERUSER_ID

_logger = logging.getLogger(__name__)

class BaseReport(models.TransientModel):
    _name = 'base.report'
    _description = 'Base Object for All Reports'

    @api.multi
    def action_print(self):
        qms_url = self.env['ir.config_parameter'].get_param('web.qms.url')

        import threading
        # call the maintainence_function here
        t = threading.Thread(target=self.execute_queue, args=[qms_url])
        # setDaemon=False to stop the thread after complete
        t.setDaemon(False)
        # starting the thread
        t.start()

        return True

    @api.multi
    def execute_queue(self, qms_url):
        try:
            _logger.info("Queue [{}] Execution Starting !".format(self.id))

            self.ensure_one()

            common = xmlrpclib.ServerProxy('{}/xmlrpc/2/common'.format(qms_url))
            models = xmlrpclib.ServerProxy('{}/xmlrpc/2/object'.format(qms_url))
            uid = common.authenticate(self.env.cr.dbname, '{your_username}', '{your_userpassword}', {})

            models.execute_kw(self.env.cr.dbname, uid, '{your_userpassword}', 'queue.management.line', 'execute_thread', [self.id])

            _logger.info("Queue [{}] Execution Done Successfully !".format(self.id))

        except Exception as Ex:
            _logger.exception("Queue [{}] Execution Failed !".format(self.id))

        finally:
            return True

    @api.model
    def execute_thread(self, queue_id):
        def run_queue(queue_id, dbname):
            db_registry = registry(dbname)

            with api.Environment.manage(), db_registry.cursor() as cr:
                env = api.Environment(cr, SUPERUSER_ID, {})

                try:
                    {do_your_action_here}

                except Exception as Ex:
                    _logger.exception("Queue [{}] Execution Failed !".format(queue_id))

        self.env.cr.after("commit", partial(run_queue, queue_id, self.env.cr.dbname))

        return True

希望它对您也有帮助。