Как запустить odoo автоматизированное расписание (cron job) в другой среде - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть некоторые запланированные действия для генерации отчетов, для которых требовались миллионы и даже миллиарды необработанных данных, всякий раз, когда запланированное действие, выполняемое на бэкэнде, ухудшается производительность на сервере и когда пользователи, получающие доступ к системе, замедляются.Теперь идея состоит в том, чтобы выполнить все запланированные действия в другой среде, чтобы она не потребляла ресурсы производственной среды.

Итак, у меня будет 3 среды:

  1. База данныхСреда
  2. Производственная среда
  3. Другая среда

"Другая среда" реплицируется из производственной среды для выполнения всех запланированных действий.Обе среды будут подключаться к среде базы данных.

Мой вопрос заключается в том, как настроить ir.cron, чтобы в производственной среде не запускался планировщик, а вместо этого он работал в другой среде?

ИЛИ

Любое предложение по другому способу достижения моей цели - выполнять тяжелые процессы в другой среде ??

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 12 октября 2018

Чтобы ответить на мой собственный вопрос:

Я использую Threading & API веб-службы Odoo для достижения моей цели.

Сначала ясоздайте базу классов отчетов для всех моделей переходного процесса, которые будут записаны в методе и модели действия печати, перед выполнением я использую поток, чтобы перебросить действие в другую среду, которую я назвал средой QMS (Queue Management System), для обработки его метода действия.

# -*- 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

Надеюсь, вам это тоже поможет.

...