配置参数说明
从上面我们可以看到配置的这个xxx_data.xml文件在文件的第4行配置了model="ir.cron" 那么我们在oe中打开model ir_cron 可以看到该class的_columns有如下字段:
_columns = {
'name': fields.char('Name', required=True),
'user_id': fields.many2one('res.users', 'User', required=True),
'active': fields.boolean('Active'),
'interval_number': fields.integer('Interval Number',help="Repeat every x."),
'interval_type': fields.selection( [('minutes', 'Minutes'),
('hours', 'Hours'), ('work_days','Work Days'), ('days', 'Days'),('weeks', 'Weeks'), ('months', 'Months')], 'Interval Unit'),
'numbercall': fields.integer('Number of Calls', help='How many times the method is called,\na negative number indicates no limit.'),
'doall' : fields.boolean('Repeat Missed', help="Specify if missed occurrences should be executed when the server restarts."),
'nextcall' : fields.datetime('Next Execution Date', required=True, help="Next planned execution date for this job."),
'model': fields.char('Object', help="Model name on which the method to be called is located, e.g. 'res.partner'."),
'function': fields.char('Method', help="Name of the method to be called when this job is processed."),
'args': fields.text('Arguments', help="Arguments to be passed to the method, e.g. (uid,)."),
'priority': fields.integer('Priority', help='The priority of the job, as an integer: 0 means higher priority, 10 means lower priority.')
}
name 即该task的名称,由用户定义为该task主要的职责
user_id 对应res_users表,需要一个用户ID
active 是否激活该task,默认为True
interval_number 间隔时间,类型为integer
interval_type 执行task的周期类型,只能选择分钟、小时、天、周、月,可惜没有秒。
numbercall 方法调用多少次,-1则是没有限制
doall 如果任务执行时间错过了服务器重启时间是否重新执行任务
nextcall 下次的调用时间,我们不用配置,oe会自动计算
model 即模块名称
function 要执行的方法
args 传递的参数
priority 任务优先级别 0是最高级别,10是最低级别
执行过程
在ir_cron模块中主要有三个主要的方法分别为:_callback、_process_job、_acquire_job ,在server.py文件中有如下的python代码:
def cron_thread(self, number):
while True:
time.sleep(SLEEP_INTERVAL + number) # Steve Reich timing style
registries = openerp.modules.registry.RegistryManager.registries
_logger.debug('cron%d polling for jobs', number)
for db_name, registry in registries.items():
while True and registry.ready:
acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name)
if not acquired:
break
到此调用过程就清楚了,server先调用_acquire_job 方法,_acquire_job 会根据dbname获取任务执行的相关数据、例如获取数据操作cr对象,要执行的jobs等,例如:
db = openerp.sql_db.db_connect(db_name)
threading.current_thread().dbname = db_name
cr = db.cursor()