[本文基于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. 关闭BrowserLink-解决异常/arterySignalR/ping未找到

    在使用VS2013 MVC5开发时经常在浏览器的调试窗口看到错误信息,并且每隔两分钟就会出现错误提示:"/365e6ccac83b4cceadee2752a93b81ae/arterySig ...

  2. Notice: Trying to get property of non-object problem(PHP)解决办法 中间件只能跳转不能返任何数据

    这里实际是调用了一个zend的数据库访问的方法,使用了fetchAll方法,但由于数据库中没有该记录,所以返回的对象是null,所以我就判断对象是否为null: 复制代码代码如下: if($obj== ...

  3. iOS官方Sample大全

    转载自:http://blog.csdn.net/yangtb2010/article/details/7005471 http://developer.apple.com/library/ios/s ...

  4. Android UI 绘制过程浅析(三)layout过程

    前言 上一篇blog中,了解到measure过程对View进行了测量,得到measuredWidth/measuredHeight.对于ViewGroup,则计算出全部children的宽高进行求和. ...

  5. loadrunner负载测试实例

    回想起第一次做性能测试,感慨万千,故写下本文,从:设置虚拟用户,设置场景以及分析运行结果三个方面进行阐述 硬件环境:硬盘 1TG,cpu 3.40GHz,内存4G 软件环境:IE9.0,Weblogi ...

  6. js 用延时函数来实现像鼠标移入qq头像然后会出现新的模块

    就好像这功能. 代码如下 <style> #div1{ width:50px; height:50px; background:red; margin-bottom:10px; } #di ...

  7. OKR——Objectives and Key Results

    1.OKR天生就有两个典型特征: 1)在精不在多——因为它是用来明确工作重心的(set one's priorities): 2)全体公开.透明——当你能够看到你的同级(peers).小老板(直接上级 ...

  8. Spark Streaming源码解读之Job动态生成和深度思考

    本期内容 : Spark Streaming Job生成深度思考 Spark Streaming Job生成源码解析 Spark Core中的Job就是一个运行的作业,就是具体做的某一件事,这里的JO ...

  9. Ubuntu 12.10使用apt安装Oracle/Sun JDK

    apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get ...

  10. python函数,lambda表达式,三目运算,列表解析,递归

    一.自定义函数 定义函数时,函数体不执行:只有在调用函数时,函数体才执行.函数的结构: 1. def 2. 函数名 3. 函数体 def func_name(): 函数体 4. 返回值 如果没有声明返 ...