odoo开发笔记 -- 借助模块queue_job实现异步方法调用
场景描述:
对比了几个定时调度的框架,发现各有优缺点;
celery 很强,异步定时调度,异步周期调度,也有延时调度的功能,但是延时调度的案例比较少,遂暂时不使用。
queue_job,一个odoo第三方应用模块,同样功能强大,可以满足日常的异步方法执行;
模块github地址:https://github.com/OCA/queue/tree/10.0/queue_job
但是我们的场景稍微有些不同,就是需要在异步调用的基础上增加一个延时(例5秒);
一般的异步调度机制:异步执行避免了任务的阻塞,相当于将需要下一步执行的任务(函数or方法),添加到了一个待执行的队列中,然后交给后台程序去慢慢处理,
处理的速度及性能,取决于服务器的硬件配置以及给相应任务开辟的进程数量。
回到我们的需求,通过分析queue_job模块的代码,大概找到我们需要定制修改的位置,即:在job开始执行前增加一个延时,下图为未修改之前:

修改后代码:

注意:这样虽然可以满足需求,但是会有新的问题,造成系统走到这里需要等待5秒时间,
实际生产环境,修改后,需要观察性能,如果处理效率满足不了实际情况,可以考虑适当增加服务器CPU配置,以及配置文件中的worker数,即多开辟进程。
顺便分享下,模块queue_job的基本使用及配置。
1. 模块介绍
2. 下载--根据自己odoo实际版本下载
第三方市场:https://www.odoo.com/apps/modules/10.0/queue_job/
github: https://github.com/OCA/queue/tree/10.0/queue_job
3. 配置
This addon adds an integrated Job Queue to Odoo. It allows to postpone method calls executed asynchronously. Jobs are executed in the background by a Jobrunner, in their own transaction. Example: 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)
In the snippet of code above, when we call button_do_stuff, a job capturing the method and arguments will be postponed. It will be executed as soon as the Jobrunner has a free bucket, which can be instantaneous if no other job is running. Features: Views for jobs, jobs are stored in PostgreSQL
Jobrunner: execute the jobs, highly efficient thanks to PostgreSQL's NOTIFY
Channels: give a capacity for the root channel and its sub-channels and segregate jobs in them. Allow for instance to restrict heavy jobs to be executed one at a time while little ones are executed 4 at a times.
Retries: Ability to retry jobs by raising a type of exception
Retry Pattern: the 3 first tries, retry after 10 seconds, the 5 next tries, retry after 1 minutes, ...
Job properties: priorities, estimated time of arrival (ETA), custom description, number of retries
Related Actions: link an action on the job view, such as open the record concerned by the job
Table of contents Installation
Configuration
Usage
Developers
Known issues / Roadmap
Changelog
Next
10.0.1.0.0
Bug Tracker
Credits
Authors
Contributors
Maintainers
Installation
Be sure to have the requests library. Configuration
Using environment variables and command line:
Adjust environment variables (optional):
ODOO_QUEUE_JOB_CHANNELS=root:4 or any other channels configuration. The default is root:1
if xmlrpc_port is not set: ODOO_QUEUE_JOB_PORT=8069
Start Odoo with --load=web,web_kanban,queue_job and --workers greater than 1. [1]
Using the Odoo configuration file:
[options]
(...)
workers = 6
server_wide_modules = web,queue_job (...)
[queue_job]
channels = root:2
Confirm the runner is starting correctly by checking the odoo log file:
...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
Create jobs (eg using base_import_async) and observe they start immediately and in parallel.
Tip: to enable debug logging for the queue job, use --log-handler=odoo.addons.queue_job:DEBUG
[1] It works with the threaded Odoo server too, although this way of running Odoo is obviously not for production purposes.
Usage
To use this module, you need to: Go to Job Queue menu
Developers
Bypass jobs on running Odoo When you are developing (ie: connector modules) you might want to bypass the queue job and run your code immediately. To do so you can set TEST_QUEUE_JOB_NO_DELAY=1 in your enviroment. Bypass jobs in tests When writing tests on job-related methods is always tricky to deal with delayed recordsets. To make your testing life easier you can set test_queue_job_no_delay=True in the context. Tip: you can do this at test case level like this @classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(
cls.env.context,
test_queue_job_no_delay=True, # no jobs thanks
))
Then all your tests execute the job methods synchronously without delaying any jobs.
官方说明
先配置odoo配置文件:
在odoo.conf中增加如下:
4. 使用
5. 查看结果
odoo开发笔记 -- 借助模块queue_job实现异步方法调用的更多相关文章
- odoo开发笔记--一个模块显示两个一级菜单
场景描述: 在已启动开发的模块中,odoo顶部一级菜单只有一个“会员管理”,需求是:在同一级顶部菜单,增加新菜单“产品管理”.举例如图: 处理方式: 按照odoo的机制,实现这种效果,可以 ...
- odoo开发笔记 -- 升级模块 提示外部ID找不到
可能的原因: 排查顺序: 1.id在视图中的加载顺序问题. 可能是:__manifest__.py文件,view文件先后加载顺序有问题:也可能是:xml 视图文件中,被引用的id出现在了引用id的下方 ...
- odoo开发笔记 -- 官方模块一览表
模块名称 技术名称 作者 电子发票管理 account OpenERP SA 会计与财务 account_accountant OpenERP SA 合同管理 account_analytic_ana ...
- odoo开发笔记 -- 新建模块扩展原模块增加菜单示例
场景描述: 1. 扩展了新模块 2.想要
- odoo开发笔记 -- div标签代替odoo button写法
odoo开发笔记 -- div标签代替odoo button写法 并调用自定义js <footer> <div id="confirm_request_cloud_repo ...
- odoo开发笔记 -- 搜索视图继承扩展
odoo开发笔记 -- 搜索视图继承扩展
- odoo开发笔记 -- 后台日志输出及分析
odoo开发笔记 -- 后台日志输出及分析 附:日志分析软件
- odoo开发笔记 -- 附件上传
附件上传基本原理实现,可以参考这篇: https://www.cnblogs.com/ljwTiey/p/7348291.html http://blog.csdn.net/wangnan537/ar ...
- odoo开发笔记 -- 用户配置界面如何增加模块访问权限
在odoo设置界面,点击用户,进入用户配置界面,会看到: 访问权 | 个人资料菜单 在访问权 page菜单界面,可以看到系统预制的一些模块都会显示在这里, 那么,我们自己开发的模块如何显示在这块呢,从 ...
随机推荐
- error C4996: 'AVStream::codec': was declared deprecated
关闭VS的SDL检查 工程 属性=>C/C++ =>General=> SDL checks 改为 No(/sdl).
- xshell免费版
1.说明 百度搜索xshell有时候会跳到国内的一个网站,从那个网站下载的xshell是收费的,但是国外的网站还是可以下载到免费为学生和学校使用的版本. 2.下载网址 网址:https://www.n ...
- Django 之 CBV
Django 中有两种编写方式,FBV 和 CBV,那么什么是 FBV,CBV 又是什么呢? 一.什么是 CBV FBV(function base views) 就是在视图里使用函数处理请求(常见) ...
- Linux中怎么升级PHP
推荐yum源安装: #查看 删除老php版本的源 yum list installed | grep php yum remove php.x86_64 php-cli.x86_64 php-comm ...
- 转载: JavaScript中执行环境和栈
在这篇文章中,我会深入理解JavaScript最根本的组成之一 : "执行环境(执行上下文)".文章结束后,你应该对解释器试图做什么,为什么一些函数/变量在未声明时就可以调用并且他 ...
- 最长上生子序列LIS
学习动态规划问题(DP问题)中,其中有一个知识点叫最长上升子序列(longest increasing subsequence),也可以叫最长非降序子序列,简称LIS.简单说一下自己的心得. 我们都 ...
- 洛谷P3810 陌上花开(CDQ分治)
洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...
- 前端模板引擎artTemplate.js
. 关于artTemplate模板引擎的详细原理请移步高性能JavaScript模板引擎原理解析,本文只探讨如何使用.初学前端的人一般对于绑定数据都是使用原生js或者jquery来拼接字符串,此为ha ...
- sublime设置默认字体样式
因电脑配置的不同,还有个人喜好的不同,有时候想用自己喜欢的字体来写代码,想用自己习惯的字号大小来显示代码.这些又该怎样设置呢? 本节主要介绍下如何设置字体大小和样式 (1)点菜单栏 “Preferen ...
- font-awesome图标显示问题解决方案
font-awesome一个很强大的字体图标库.下载链接:http://fontawesome.dashgame.com/刚开始使用font-awesome的新手往往容易只引入一个css文件,这样就会 ...