[本文基于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#) 求两个数组的交集

    基本上在面试的时候,会具体到两个int数组,或string数组.具体也就是讨论算法. 首先需要的是和面试的人确认题目的含义,并非直接答题. 然后,可以提出自己的想法,首先最快的是用linq { Lis ...

  2. StringIO学习

    StringIO StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO.一个简单的例子,让你对StringIO有一 ...

  3. 随便2--struct pointer

    同为struct,如果struct中没有指针, C 和C++可以用等号赋值,但是一旦里面涉及到指针,就不能用等号,要用memcpy struct A{char v1[20];int v2;} a,b; ...

  4. html 定位问题

    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...

  5. [IIS]IIS扫盲(七)

    (4)汉化补丁 许多软件都是英文版本的,国人的英语水平普遍不高,包括笔者.因为这个,影响了不少人学习电脑的兴趣. 为了占领市场,软件开发商提供了中文版本:为了大家学习方便,爱好汉化工作的国人制作了汉化 ...

  6. Sql语句查看表结构

    快速查看表对的就说明,及表字段描述及字段类型 --表描述 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ds LEFT JOI ...

  7. python3实现简单爬虫功能

    本文参考虫师python2实现简单爬虫功能,并增加自己的感悟. #coding=utf-8 import re import urllib.request def getHtml(url): page ...

  8. 洛谷P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 282通过 1.1K提交 题目提供者HansBug 标签 难度普及/提高- 提交  讨论  题解 最新讨论 不萌也是新,老司机求带 求看,spfa跑模板40分 为什么 ...

  9. 通过AngularJS实现图片上传及缩略图展示

    从项目中截出的代码 HTML部分: <section> <img src="image/user-tuijian/tuijian_banner.png" /> ...

  10. 用移动智能设备访问Ossim系统

    用移动智能设备访问Ossim系统 下面我们使用iPad,iPhone访问ossim系统的效果. 高清视频:http://www.tudou.com/programs/view/TikMZ1z1ELw ...