跳转到主要内容

工作队列

项目描述

Mature License: LGPL-3 OCA/queue Translate me on Weblate Try me on Runbot

此插件为Odoo添加了一个集成的工作队列。

它允许异步执行的方法调用延迟执行。

工作由后台的Jobrunner执行,在其自己的事务中。

示例

from odoo import models, fields, api
from odoo.addons.queue_job.job import job

class MyModel(models.Model):
   _name = 'my.model'

   @api.multi
   @job
   def my_method(self, a, k=None):
       _logger.info('executed with a: %s and k: %s', a, k)


class MyOtherModel(models.Model):
    _name = 'my.other.model'

    @api.multi
    def button_do_stuff(self):
        self.env['my.model'].with_delay().my_method('a', k=2)

在上面的代码片段中,当我们调用button_do_stuff时,将延迟一个捕获方法和参数的工作。它将在Jobrunner有空闲桶时执行,如果没有其他工作正在运行,这可以是瞬时的。

功能

  • 工作视图,工作存储在PostgreSQL中

  • Jobrunner:执行工作,由于PostgreSQL的NOTIFY功能而非常高效

  • 通道:为根通道及其子通道提供容量,并在其中隔离工作。例如,可以限制重工作一次执行,而轻工作四次执行。

  • 重试:通过引发异常类型来重试工作的能力

  • 重试模式:前三次尝试,10秒后重试,接下来的五次尝试,1分钟后重试,……

  • 工作属性:优先级,预计到达时间(ETA),自定义描述,重试次数

  • 相关操作:在工作视图中链接操作,例如打开由工作记录相关的记录

目录

安装

请确保拥有requests库。

配置

  • 使用环境变量和命令行

    • 调整环境变量(可选)

      • ODOO_QUEUE_JOB_CHANNELS=root:4 或其他通道配置。默认为 root:1

      • 如果未设置 xmlrpc_portODOO_QUEUE_JOB_PORT=8069

    • 使用 --load=web,queue_job--workers 大于 1 的参数启动 Odoo。 [1]

  • 使用 Odoo 配置文件

[options]
(...)
workers = 6
server_wide_modules = web,queue_job

(...)
[queue_job]
channels = root:2
  • 通过检查 odoo 日志文件来确认运行器是否正确启动

...INFO...queue_job.jobrunner.runner: starting
...INFO...queue_job.jobrunner.runner: initializing database connections
...INFO...queue_job.jobrunner.runner: queue job runner ready for db <dbname>
...INFO...queue_job.jobrunner.runner: database connections ready
  • 创建任务(例如使用 base_import_async)并观察它们立即并行启动。

  • 提示:要启用队列任务的调试日志,使用 --log-handler=odoo.addons.queue_job:DEBUG

使用

要使用此模块,您需要

  1. 转到 作业队列 菜单

开发者

绕过运行中的 Odoo 的作业

在开发过程中(例如:连接器模块)您可能希望绕过队列作业并立即运行代码。

要这样做,您可以在环境中设置 TEST_QUEUE_JOB_NO_DELAY=1

在测试中绕过作业

编写与作业相关的方法的测试时,处理延迟的记录集总是很棘手。为了使您的测试更轻松,您可以在上下文中设置 test_queue_job_no_delay=True

提示:您可以在测试用例级别这样做

@classmethod
def setUpClass(cls):
    super().setUpClass()
    cls.env = cls.env(context=dict(
        cls.env.context,
        test_queue_job_no_delay=True,  # no jobs thanks
    ))

然后,您的所有测试都将同步执行作业方法,而不会延迟任何作业。

已知问题/路线图

  • 在创建新数据库或在现有数据库上安装 queue_job 后,必须重新启动 Odoo 以使运行器检测到它。

  • 当 Odoo 正常关闭时,它将等待运行中的作业完成。然而,当 Odoo 服务器崩溃或被强制停止时,运行中的作业在运行器没有机会知道它们已被终止的情况下被中断。在这种情况下,作业在 Odoo 服务器停止后可能仍然处于 已开始已入队 状态。由于运行器无法知道它们是否实际上正在运行,并且无法确定是否可以安全地重新启动作业,因此它不会尝试自动重新启动它们。因此,这些陈旧的作业会填充运行队列,并阻止其他作业启动。因此,您必须手动重新入队它们,无论是从作业视图,还是通过运行以下 SQL 语句 在启动 Odoo 之前

update queue_job set state='pending' where state in ('started', 'enqueued')

变更日志

下一页

  • [重要] 如果明确将根通道的容量设置为 0,则不要启动 Jobrunner

  • [新增] 使用多动作将多个作业设置为完成的能力(来自 #59

  • [参考] 提取处理作业失败时消息发布的处理方法,允许从插件中修改此行为

  • [新增] 作业的默认“相关操作”,打开表单或列表视图(当作业分别链接到一个或多个记录时)。 (#46)

  • [修复] 手动创建作业通道时的错误 (#96)

11.0.1.1.0 (2018-05-25)

  • [新增] 新的整洁 OCA 读取文件格式 (#71)

  • [新增] Jobrunner 将保持相同的 Web 会话,而不再为每个作业生成新的会话 (#54)

  • [新增] 可配置的方案、主机和 HTTP 认证 (#51)

  • [新增] base_sparse_field 不再需要在 --load 中设置 (#47)

  • [修复] 正确自动注册渠道和作业功能 (#69)

  • [修复] 正确与 @property 方法兼容 (#50#69)

错误跟踪器

错误在 GitHub Issues 上追踪。如有问题,请检查您的错误是否已被报告。如果您是第一个发现它的,请帮助我们消除它,提供详细且受欢迎的 反馈

请不要直接联系贡献者以获取支持或帮助解决技术问题。

鸣谢

作者

  • Camptocamp

  • ACSONE SA/NV

贡献者

维护者

本模块由OCA维护。

Odoo Community Association

OCA,即Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛应用。

当前 维护者

guewen

本模块是GitHub上的OCA/queue项目的一部分。

欢迎您贡献。要了解如何贡献,请访问 https://odoo-community.org/page/Contribute

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码分发

本版本没有提供源代码分发文件。请参阅有关 生成分发存档 的教程。

构建分发

odoo11_addon_queue_job-11.0.1.4.0-py2.py3-none-any.whl (85.0 kB 查看散列值)

上传时间 Python 2 Python 3

由以下机构支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF 赞助商 PingdomPingdom 监控 SentrySentry 错误记录 StatusPageStatusPage 状态页面