首页 > 其他 > 详细

activiti源码学习之ProcessEngine

时间:2014-02-18 16:09:24      阅读:475      评论:0      收藏:0      [点我收藏+]

ProcessEngine是什么?有什么用?

ProcessEngine:流程引擎的抽象,对于开发者来说,它是我们使用Activiti的facade,通过它可以获得我们需要的一切服务。

看ProcessEngine接口源码,可以看出,它提供了获取所有服务的方法:

public interface ProcessEngine {

  /** the version of the activiti library */
  public static String VERSION = "5.9";

  /** The name as specified in ‘process-engine-name‘ in 
   * the activiti.cfg.xml configuration file.
   * The default name for a process engine is ‘default */
  String getName();

  RepositoryService getRepositoryService();
  RuntimeService getRuntimeService();
  FormService getFormService();
  TaskService getTaskService();
  HistoryService getHistoryService();
  IdentityService getIdentityService();
  ManagementService getManagementService();

  void close();
}


二 ProcessEngine是怎么创建的?

既然ProcessEngine是个接口,那么就有它的实现类,它的实现类为ProcessEngineImpl。ProcessEngineImpl只有一个构造方法:

public ProcessEngineImpl(ProcessEngineConfigurationImpl processEngineConfiguration) {
    this.processEngineConfiguration = processEngineConfiguration;
    this.name = processEngineConfiguration.getProcessEngineName();
    this.repositoryService = processEngineConfiguration.getRepositoryService();
    this.runtimeService = processEngineConfiguration.getRuntimeService();
    this.historicDataService = processEngineConfiguration.getHistoryService();
    this.identityService = processEngineConfiguration.getIdentityService();
    this.taskService = processEngineConfiguration.getTaskService();
    this.formService = processEngineConfiguration.getFormService();
    this.managementService = processEngineConfiguration.getManagementService();
    this.databaseSchemaUpdate = processEngineConfiguration.getDatabaseSchemaUpdate();
    this.jobExecutor = processEngineConfiguration.getJobExecutor();
    this.commandExecutor = processEngineConfiguration.getCommandExecutorTxRequired();
    this.sessionFactories = processEngineConfiguration.getSessionFactories();
    this.historyLevel = processEngineConfiguration.getHistoryLevel();
    this.transactionContextFactory = processEngineConfiguration.getTransactionContextFactory();
    
    commandExecutor.execute(new SchemaOperationsProcessEngineBuild());

    if (name == null) {
      log.info("default activiti ProcessEngine created");
    } else {
      log.info("ProcessEngine " + name + " created");
    }
    
    ProcessEngines.registerProcessEngine(this);

    if ((jobExecutor != null) && (jobExecutor.isAutoActivate())) {
      jobExecutor.start();
    }
  }
不难看出,ProcessEngineImpl是通过ProcessEngineConfigurationImpl获取的服务对象。
看ProcessEngineConfigurationImpl的BuildProcessEngine方法:

  public ProcessEngine buildProcessEngine() {
    init();
    return new ProcessEngineImpl(this);
  }

不难看出ProcessEngine的创建就很简单,通过ProcessEngineConfigurationImpl buildProcessEngine方法创建,将自己传送给ProcessEngine对象,ProcessEngine获取服务对象等配置信息。

在java应用中,可以通过buildProcessEngine来初始化ProcessEngine。


既然知道了是通过ProcessEngineConfigurationImpl 初始化的,那么接下来看看在初始化过程中都做了什么?

回头看

buildProcessEngine方法

里面只有个init()方法,那么这个初始化方法都做了什么呢?看源码:

protected void init() {
    initHistoryLevel();
    initExpressionManager();
    initVariableTypes();
    initBeans();
    initFormEngines();
    initFormTypes();
    initScriptingEngines();
    initBusinessCalendarManager();
    initCommandContextFactory();
    initTransactionContextFactory();
    initCommandExecutors();
    initServices();
    initIdGenerator();
    initDeployers();
    initJobExecutor();
    initMailScanner();
    initDataSource();
    initTransactionFactory();
    initSqlSessionFactory();
    initSessionFactories();
    initJpa();
    initDelegateInterceptor();
    initEventHandlers();
  }
哇哦,初始化了这么多东西,我们分别来看看,都初始化了什么。一个一个看:

1> 初始化历史记录级别

public void initHistoryLevel() {
    if (HISTORY_NONE.equalsIgnoreCase(history)) {
      historyLevel = 0;
    } else if (HISTORY_ACTIVITY.equalsIgnoreCase(history)) {
      historyLevel = 1;
    } else if (HISTORY_AUDIT.equalsIgnoreCase(history)) {
      historyLevel = 2;
    } else if (HISTORY_FULL.equalsIgnoreCase(history)) {
      historyLevel = 3;
    } else {
      throw new ActivitiException("invalid history level: "+history);
    }
  }
这里看不出什么,看源码是设置记录历史级别,就是什么样的级别的历史信息需要持久化到数据库中。默认为audit

2> 初始化表达式管理器

protected void initExpressionManager() {
    if (expressionManager==null) {
      expressionManager = new ExpressionManager();
    }
  }
3> 初始化activiti自定义类型

4> 初始化Beans容器。

5> initFormEngines。

6> initFormTypes。

7> initScriptingEngines();

8> initBusinessCalendarManager();

9> initCommandContextFactory();

10> initTransactionContextFactory();

11> initCommandExecutors():初始化命令执行环境。这个比较重要,后续细致研究。

12> initServices():初始化服务,比较重要,后续研究。

13> initIdGenerator(): 初始化主见生成器,后续细致研究。

14> initDeployers();

15> initJobExecutor();

16> initMailScanner();

17>  initDataSource();

18>    initTransactionFactory();初始化事务工厂

19>    initSqlSessionFactory();初始化SqlSession工厂

20>    initSessionFactories();初始化Sessin工厂

21>    initJpa();

22>   initDelegateInterceptor();

23>    initEventHandlers();初始化时间监听


具体细节不是本文的重点,标红的部分都是比较重要的东西,后续要深入学习研究,并总结。



总结

1.ProcessEngine是Activiti的门面接口,提供访问内部所有服务Api的门面。开发者最常用,也是必须要用的。

2.ProcessEngine通过ProcessEngineConfigurationImpl初始化,并在初始化的过程中,完成activiti内部需要的服务、全局变量、事务管理、sqlSession等的初始化。


activiti源码学习之ProcessEngine

原文:http://blog.csdn.net/dreamming_now/article/details/19402193

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!