一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获取的服务对象。
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等的初始化。
原文:http://blog.csdn.net/dreamming_now/article/details/19402193