我有一些计划的操作来生成报告,这些报告需要数百万甚至数十亿的原始数据,每当计划的操作在后端运行时,服务器的性能就会受到影响,并且当用户访问系统速度变慢时。现在的想法是在另一个环境上执行所有计划的操作,以免消耗生产环境资源。
所以我要有3种环境:
从生产环境中复制“其他环境”以运行所有计划的操作。两种环境都将连接到数据库环境。
我的问题是如何配置ir.cron,以便在生产环境中不运行调度程序,而是在其他环境中运行它?
OR
任何建议实现我的目标的另一种方法,那就是在另一种环境上进行繁重的工作?
请帮助。
答案 0 :(得分:0)
回答我自己的问题:
我正在使用threading和Odoo 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
希望它对您也有帮助。