需求描述:需要在某一特定的时间执行某一段python代码,可具有一定的周期性
odoo中查看所定义的定时任务:
创建定时任务:
方式一:
界面创建:依次点击 安排的动作-->创建
方式二:
通过代码创建定时任务
一般是创建在模块中的data文件夹,下面以我创建的一个定时任务为例子:
<odoo>
<data noupdate="1">
<record id="ir_cron_sync_plm_material" model="ir.cron">
<field name="name">金蝶云星空: 同步客户供应商</field>
<field name="model_id" ref="maono_kingdee_cloud.model_res_partner"/>
<field name="state">code</field>
<field name="code">
model.sync_kingdee_res_partner_cron()
</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="nextcall"
eval="(DateTime.now().replace(hour=0, minute=0, second=0) + timedelta(days=1)).
strftime('%Y-%m-%d %H:%M:%S')" />
</record>
</data>
</odoo>
参数介绍:
ir.corn :定时任务所存放的模型,如果需要用sql批量操作,模型就是ir_cron
name : 定时任务名字
model_id : 通过ref属性配置定时任务所绑定的模型,形式是“包名.model_模型名”,下面的 code属性的python方法就是从所绑定的模型中调用
code : 执行该定时任务所调用的python代码
user_id :调度程序的用户
interval_number:调用间隔,即每隔多久调用一次
interval_type:调用单位,年、月、日
numbercall:调用次数,-1表示不限制次数
nextcall: 下一次调用时间
doall :如果任务的执行时间刚好因服务器重启错过,是否立刻执行
queue_job 模块异步执行:
模块地址:https://github.com/OCA/queue/tree/10.0/queue_job
使用其实非常简单,使用之前在配置文件添加如下设置:
[options]
# 要使用的处理器数量
workers = 4
server_wide_modules = base,web,queue_job
[queue_job]
channels = root:2
安装模块:
xml配置定时任务:
<odoo>
<record id="ir_cron_stock_alert" model="ir.cron">
<field name="name">库存预警</field>
<field name="model_id" ref="maono_stock_alert.model_stock_alert"/>
<field name="state">code</field>
<field name="code">
model.with_delay().action_send_email()
</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">7</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="nextcall"
eval="(DateTime.now().replace(hour=0, minute=0, second=0) + timedelta(days=2)).
strftime('%Y-%m-%d %H:%M:%S')"/>
</record>
<record id="maono_default_stock_alert_email" model="ir.config_parameter">
<field name="key">stock_alert_email_to</field>
<field name="value" eval=""> </field>
</record>
</odoo>
注意:with_delay()方法使得该任务异步执行,然后进入作业队列菜单就可以看到所执行的定时任务。
还有就是服务器重启之前执行sql,修改任务状态,放置堵塞:
update queue_job set state='pending' where state in ('started', 'enqueued')