一、概述
queue_job
是一个用于在 Odoo 中实现异步任务队列的模块,它能够帮助你处理长时间运行的任务(例如导入大量数据、生成报表等),并且可以在后台异步执行,而不会阻塞 Odoo 的主线程。使用 queue_job
可以显著提升 Odoo 系统的性能和响应速度。
常见的使用场景包括:
- 数据导入导出
- 生成和发送报表
- 批量处理操作
- 定期任务调度
二、Demo
from odoo import models, fields, api from odoo.addons.queue_job.job import job import random class DemoQueueJob(models.Model): _name = 'demo.queue.job' _description = 'Demo Queue Job' name = fields.Char('Job Name', default="Queue Job Demo") description = fields.Text('Description') @job(priority=10) # priority 值越大优先级越高 def my_async_method(self, arg1, arg2): """ 异步任务的实际执行方法 """ print(f"开始处理异步任务:{self.name}, 参数: {arg1}, {arg2}") # 模拟一些长时间的操作 if random.choice([True, False]): # 随机模拟任务失败 raise ValueError("模拟任务失败!") print(f"异步任务 {self.name} 完成.") return True def trigger_async_task(self): """ apply_async触发异步任务并加入队列。单独调用不会触发 """ self.my_async_method.apply_async(args=('value1', 'value2')) def schedule_task(self): """ 定时调度任务,每小时执行一次 """ self.my_async_method.apply_async( interval=3600, # 每小时运行一次 nextcall=fields.Datetime.now(), # 从现在开始 args=('scheduled', 'task') ) def trigger_task_with_retry(self): """ 启动一个带有重试机制的任务 """ try: self.my_async_method.apply_async( args=('fail', 'test'), # 强制模拟失败 max_retries=3 # 最大重试次数为 3。也可以在job中设置max_retries ) except Exception as e: print(f"任务失败,错误信息:{e}")
demo2
from odoo import models, fields from odoo.addons.queue_job.job import job import random class DemoQueueJob(models.Model): _name = 'demo.queue.job' _description = 'Demo Queue Job' name = fields.Char('Job Name', default="Queue Job Demo") description = fields.Text('Description') @job(max_retries=3, default_retry_delay=60) # 设置最大重试次数和每次重试的延迟时间(单位:秒) def my_async_method(self, arg1, arg2): """ 异步任务的实际执行方法 """ print(f"开始处理异步任务:{self.name}, 参数: {arg1}, {arg2}") # 模拟任务失败:故意触发异常以测试重试机制 if random.choice([True, False]): # 随机模拟任务失败 print("任务失败,准备重试...") raise ValueError("模拟任务失败!") print(f"异步任务 {self.name} 完成.") return True def trigger_task_with_retry(self): """ 启动一个带有重试机制的任务 """ self.my_async_method.apply_async( args=('fail', 'test') # 强制模拟失败 )
标签:异步,name,self,阻塞,job,任务,Odoo,async From: https://www.cnblogs.com/watermeloncode/p/18640799