[本文基于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. [内核]Linux workqueue

    转自:http://blog.chinaunix.net/uid-24148050-id-296982.html 一.workqueue简介workqueue与tasklet类似,都是允许内核代码请求 ...

  2. 使用dojoConfig配置dojo(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/dojo_config/index.html dojoConfig对象(原来是djConfig对 ...

  3. [工具开发] keepalived使用nagios监控脚本

    最近在做开发和办公环境的高可用,采用的是keepalived:keepalived基于Linux内核支持的LVS,既能实现高可用,又能实现负载均衡,非常实用. keepalived监控服务状态时可以用 ...

  4. Gson处理

    public class GsonTools { public GsonTools(){} public static <T> T getPerson(String jsonString, ...

  5. python Requests库在处理response时的一些陷阱

    python的Requests(http://docs.python-requests.org/en/latest/)库在处理http/https请求时还是比较方便的,应用也比较广泛.但其在处理res ...

  6. R中,定义一个长度为0的向量

    定义一个长度为0的向量 > x<-c()> length(x)[1] 0 修改该向量的类型 > class(x)="numeric"> class(x ...

  7. SQL Server复制需要有实际的服务器名称才能连接到服务器

    服务器上安装的WIN2008 R2,然后没有在意机器名,安装了SQL2008 R2数据库之后,配置AD域的时候修改了机器名. 然后,开始配置数据库镜像同步的时候,先试了下数据库复制发布,结果提示“SQ ...

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

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

  9. C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法

    C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...

  10. 本机搭建外网web服务器

    版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 首先声明一下楼主是个开发人员,按理说这些搭建服务器什么的,和楼主半毛钱的关系都没有.但是呢,楼主是个爱学习的人,懂得德智体全面 ...