首页 > 代码库 > Odoo9启动过程

Odoo9启动过程

odoo包含的服务有

  1. Report
  2. Workflow
  3. XML-RPC
  4. Http web

Odoo9之后改用http方式启动服务,为了保持兼容性,还是保持了旧模式,在 openerp/netsvc.py 定义为 LocalService

??

openerp/cli/main() 函数为odoo的入口, 定义在 openerp/cli/command.py,此函数根据cli命令带的参数 判断运行哪个命令, 命令可能是

  1. deploy
  2. scaffold
  3. server
  4. shell
  5. start

如果不给出 command,则使用 默认command server.

??

启动前准备工作

  1. 检查是否是 root用户
  2. 实例化配置文件
  3. 检查pg用户
  4. 报告配置情况
  5. 检查是否设置 preload database,如果有,则创建空数据库
  6. 创建 pid 文件
  7. 启动 openerp.service.server

??

openerp.service.server启动过程

  1. 定义全局变量 server
  2. 装载 全服务器模块 load_server_wide_modules(),默认是 web web_kanban,可以通过 server_wide_modules 配置项设置更多的 预装载模块。 运行 openerp.modules.module.load_openerp_module 装载web web_kanban 模块。此时,仅仅将这些模块当作 pyton 模块处理,并不执行任何的 ORM过程
  3. 根据 configuration 启动对应的服务器,odoo支持3种服务器模式
    1. GeventServer
    2. PreforkServer
    3. ThreadedServer
  4. 如果设置了 workers 参数, 则是 preforkserver, 默认是 threadserver。然后根据配置 执行RegistryManager.new() 装载 preload 指定的数据库,和指定的模块。 odoo实例为每个数据库维护一个 registry,用来维护模块注册。使用RegistryManager 管理 registry,在 new()时, 使用openerp.modules.load_modules()加载odoo模块; 此时,不仅将odoo模块作为Python模块导入, 并执行ORM过程。

    ??

装载odoo模块以及ModelClass构建

py文件 openerp\modules\loading.py

步骤

  1. 初始化系统路径
  2. 检查数据库是否初始化,否则 初始化数据库,使用 openerp\addons\base\base.sql
  3. 初始化 模块graph,将base 添加到
  4. 执行 load_module_graph() 装载 base 模块; 初始化 注册表 和迁移管理器,执行 迁移脚本,以及odoo模块定义的 pre_init_hook ,导入odoo模块,更新 models.MetaModel.module_to_models[ ],使用 registry.load() 加载 odoo 模块。 registry.load() 首先导入 models.py, 然后 遍历 models.MetaModel.module_to_models[ ] 登记的 python class,然后执行 models.BaseModel._build_model() 基于 python class 动态 建立 oodo model class, odoo model class 将 按照 graph 里面的依赖顺序,依次继承 python class 构建 odoo model class. 例如, <class ‘openerp.addons.stock.product.product_template‘> 在 ORM 时, 将通过 depends graph 遍历出 全部的 父类【inherit[s]】,再加上它自己 ,例如 <type ‘list‘>: [<class ‘openerp.addons.stock.product.product_template‘>, <class ‘openerp.addons.sale.sale.ProductTemplate‘>, <class ‘openerp.addons.account.models.product.ProductTemplate‘>, <class ‘openerp.addons.product.product.product_template‘>, <class ‘openerp.addons.mail.models.mail_thread.MailThread‘>], 然后 基于这些 基类, 使用 type() 构建出 odoo model class. 【<class ‘openerp.api.product.template‘> 】 和 odoo model 【 template: product.template 】

Odoo9启动过程