一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