[本文基于odoo9源码编写]

odoo包含的服务有

  1. db
  2. object
  3. report
  4. workflow
  5. web[wsgi]

Odoo以wsgi 规范提供Web及Web服务db/object/report,而workflow则包含在model里面,以create[delete|redirect|signal|step]_workflow() 提供服务。Odoo9之后为了保持兼容性,还是保持了旧模式,在 openerp/netsvc.py 定义为 LocalService,提供 workflow 和 report 服务

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

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

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

启动前准备工作

  1. 检查odoo用户,不可以是 root
  2. 实例化配置文件
  3. 检查pg用户,不可以是postgres
  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,会调用 geventServer 作为longpolling  的服务端
    3. ThreadedServer
  4. 如果设置了 workers 参数, 则是 preforkserver,默认是 threadserver。然后根据配置 执行RegistryManager.new() 装载 preload 指定的数据库以及指定的模块; 如果没有指定preload,则在 第一个用户访问该odoo数据库时,装载odoo模块。 odoo实例为每个数据库维护一个 registry,用来维护模块注册。使用RegistryManager 管理 registry,在 new()时, 使用openerp.modules.load_modules()加载odoo模块; 此时,不仅将odoo模块作为Python模块导入, 并执行ORM过程。
  5. 启动wsgi 应用程序,调用 wsgi_xmlrpc() 和 openerp.http.root 这2个handler。 如果启动odoo时没有指定preload,则在第一次访问 wsgi root时,通过   ir_http = request.registry['ir.http']  尝试进行 odoo模块装载。

装载odoo模块以及ModelClass构建

openerp.modules.load_modules()  定义在  py文件   openerp\modules\loading.py

步骤

  1. 初始化系统路径
  2. 检查数据库是否初始化,否则 初始化数据库,使用  openerp\addons\base\base.sql
  3. 初始化注册表registry
  4. 加载base 模块,初始化 模块依赖图 graph,将base 添加到  图,执行    load_module_graph()   装载 base 模块,在注册表设置模型,装载语言,标记其他需要装载和升级的模块。
    1. load_module_graph() 过程如下, 初始化 注册表 和迁移管理器,执行pre 迁移脚本 ,以及odoo模块定义的 pre_init_hook指令,导入odoo模块,将模块里面定义的Model 更新 models.MetaModel.module_to_models[  ],使用  registry.load()  加载 odoo 模块,执行模块定义的 init 或者 update 指令,执行 post迁移脚本,更新翻译,更新注册表,执行odoo模块定义的 post_init_hook指令,验证视图, 装载演示数据,更新注册表。
    2. 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 时, 将通过  继承关系遍历出 全部的 父类【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 】
    3. 数据持久化部分, 待更 【 挖坑  :) 】
  5. 执行  load_marked_modules()  装载 其他已安装、或者要升级/移除的模块,此时会查询 ir_module_module, 读取需要执行 装载动作的 模块, 并加入到 depends graph 里面, 然后 再次 执行 load_module_graph()
  6. 完成安装并执行清理动作
  7. 其他步骤

Odoo启动过程的更多相关文章

  1. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  2. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  3. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  4. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  5. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  6. SpringMVC启动过程详解(li)

    通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...

  7. Android源码——Activity组件的启动过程

    根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...

  8. Netty源码分析之客户端启动过程

    一.先来看一下客户端示例代码. public class NettyClientTest { public void connect(int port, String host) throws Exc ...

  9. linux源码分析(二)-启动过程

    前置:这里使用的linux版本是4.8,x86体系. 这篇是 http://home.ustc.edu.cn/~boj/courses/linux_kernel/1_boot.html 的学习笔记. ...

随机推荐

  1. C++编程命名规则(转载)

    原文地址:http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2289291.html 如果想要有效的管理一个稍微复杂一点的体系,针对其中事物的一套 ...

  2. C++11:POD数据类型

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 啥是POD类型? POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是 ...

  3. loadView、viewDidLoad、initWithCoder、initWithNibName、awakeFromNib的用法

    转载,原地址为:http://jianyu996.blog.163.com/blog/static/11211455520131226840879/ 请尊重原创: 1,无论XIB还是代码创建都会调用l ...

  4. Hive操作表部分总结

    创建表: create table tableName(time INT,userid BIGINT,url STRING,ip STRING COMMENT 'IP Address of the U ...

  5. 快速求n的质因子(数论)

    快速求n的质因子 如何尽快地求出n的质因子呢?我们这里又涉及两个好的算法了! 第一个:用于每次只能求出一个数的质因子,适用于题目中给的n的个数不是很多,但是n又特别大的 #include<std ...

  6. youtube不显示其他人头像

    我用的是ss , 右键ss选择pac->编辑本地pac 把ggpht.com加入pac列表即可

  7. [IIS]IIS扫盲(二)

    iis - IIS之Web服务器建立 第一篇 IIS之Web服务器  一.建立第一个Web站点  比如本机的IP地址为192.168.0.1,自己的网页放在D:\Wy目录下,网页的首页文件名为Inde ...

  8. 解决:新版火狐浏览器3d打不开

    重启:按 Ctrl + Shift + L 键唤出 3d 视图 参考文档:http://tieba.baidu.com/p/4606488108

  9. 【摘要】多线程 - BeginInvoke异步调用

    private delegate int MyMethod(); private int method() { Thread.Sleep(); ; } private void MethodCompl ...

  10. HTML中的下拉列表 select

    HTML中的下拉列表: <select> <option value ="1">Volvo</option> <option value ...